这是工厂方法模式的有效代码,请验证

时间:2014-05-28 09:11:31

标签: c# design-patterns

下面的代码是针对工厂方法模式我想要验证它。如果无效则需要进行哪些更改。  在这里,我添加了使用模式的客户端代码和模式实现的代码。

我在这里使用的例子是电视遥控器,它作为工厂,根据频道号码返回我的电视频道对象。

客户端代码

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();
      }
    }
  }
 }

2 个答案:

答案 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频道意味着返回?'并且可能必须检查一些其他来源以检查正确的值。

如果您使用枚举并且有人意外地换了它,那么由于明显的措辞,下一个人将有更好的机会发现错误。