下面的代码是针对工厂方法模式我想要验证它。如果无效则需要进行哪些更改。 在这里,我添加了使用模式的客户端代码和模式实现的代码。
我在这里使用的例子是电视遥控器,它作为工厂,根据频道号码返回我的电视频道对象。
客户端代码
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();
}
}
}
}
答案 0 :(得分:0)
是的,工厂看起来也很好,我可能会打电话给工厂TVChannelNewFactory但是看起来不错。
答案 1 :(得分:0)
是的,这对我来说很好。
但对我来说,我希望能更明确地指出我在客户端层面上的期望。要做到这一点,我会在某处定义枚举,例如:
public enum TVChannels
{
BBCNew,
TimesNowNew
}
将工厂定义为:
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频道意味着返回?'并且可能必须检查一些其他来源以检查正确的值。
如果您使用枚举并且有人意外地换了它,那么由于明显的措辞,下一个人将有更好的机会发现错误。