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

本文关键字:代码 验证 有效 工厂 方法 模式 | 更新日期: 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,但其他方面似乎很好。