这是工厂方法模式的有效代码,请验证
本文关键字:代码 验证 有效 工厂 方法 模式 | 更新日期: 2023-09-27 18:05:36
下面的代码是工厂方法模式,我希望它被验证。如果无效,那么需要进行哪些更改。这里我添加了使用模式的客户端代码和实现模式的代码。
我在这里使用的例子是电视遥控器,它作为工厂并根据频道号返回我电视频道对象。
客户端代码
private void button3_Click(object sender, EventArgs e)
{
ITVChannelNew channelNew;
channelNew = RemoteNew.getChannel(1);
currentProgram = channelNew.getCurrentShow();
channelNew = RemoteNew.getChannel(2);
currentProgram = channelNew.getCurrentShow();
}
工厂方法代码
namespace WindowsFormsApplication1
{
public interface ITVChannelNew
{
string getCurrentShow();
string getNextShow();
string getPreviousShow();
}
public class TVChannelNew : ITVChannelNew
{
private readonly string previous;
private readonly string current;
private readonly string next;
public TVChannelNew(string previous, string current, string next)
{
this.previous = previous;
this.current = current;
this.next = next;
}
public string getCurrentShow()
{
return current;
}
public string getNextShow()
{
return next;
}
public string getPreviousShow()
{
return previous;
}
}
public class BBCNew : TVChannelNew
{
public BBCNew():base("BBC previous","BBC current","BB next")
{
}
}
public class TimesNowNew : TVChannelNew
{
public TimesNowNew()
: base("TimesNow previous", "TimesNow current", "TimesNow next")
{
}
}
public static class RemoteNew
{
public static ITVChannelNew getChannel(int ChannelNumber)
{
switch (ChannelNumber)
{
case 1:
return new BBCNew();
case 2:
return new TimesNowNew();
default:
return new TimesNowNew();
}
}
}
}
我觉得不错。
但是对我来说,我希望有一个更清晰的指示,我希望在客户层面上看到什么样的类型。为此,我将在某处定义一个enum,如:
public enum TVChannels
{
BBCNew,
TimesNowNew
}
并定义Factory:
public static class RemoteNew
{
public static ITVChannelNew getChannel(TVChannels channel)
{
switch (channel)
{
case TVChannels.BBCNew:
break;
case TVChannels.TimesNowNew:
break;
default:
break;
}
}
}
这样,您可以更清楚地指示要返回的类型,并且仍然让客户端不知道任何具体类型,例如:
private void button3_Click(object sender, EventArgs e)
{
ITVChannelNew channelNew;
channelNew = RemoteNew.getChannel(TVChannels.BBCNew);
currentProgram = channelNew.getCurrentShow();
channelNew = RemoteNew.getChannel(TVChannels.TimesNowNew);
currentProgram = channelNew.getCurrentShow();
}
同样,如果有人改变了你工厂周围的数字(在switch语句中),它不会立即清楚它是错误的。如果他确实发现了什么问题,他/她将不得不问"什么是45频道?"或"频道3要返回什么?"’并且可能必须检查其他来源以检查正确的值。
如果你使用了枚举,而有人不小心把它交换了,下一个人将有更大的机会发现错误,因为明显的措辞。
是的,工厂看起来也很好,我可能会称工厂为TVChannelNewFactory,但其他方面似乎很好。