工厂模式的含义

时间:2019-02-25 10:28:31

标签: c# design-patterns

使用工厂模式的主要含义是什么?

  • 一开始我们有一个简单工厂
class FanFactory : IFanFactory
{
    public IFan CreateFan(FanType type)
    {
        switch (type)
        {
            case FanType.TableFan:
                return new TableFan();
            case FanType.CeilingFan:
                return new CeilingFan();
            case FanType.ExhaustFan:
                return new ExhaustFan();
            default:
                return new TableFan();
        }
    }
}

尽管它违反了SOLID原理,但似乎合乎逻辑。使用一个工厂对象,我可以创建其他任何对象。

  • 工厂方法
static void Main(string[] args)
{
    IFanFactory fanFactory = new PropellerFanFactory();
    IFan fan = fanFactory.CreateFan();
    fan.SwitchOn();
    Console.ReadLine();
}

在这种情况下,我也可以这样做:

IFan fan = new PropellerFan();
fan.SwitchOn();

工厂方法的目的是什么?您看不到其中的代码简化。如果我们在类中使用继承,而在子级中使用继承,则在父级中添加其他方法,那么一切都会失去意义。

Link to examples

2 个答案:

答案 0 :(得分:3)

工厂模式允许:

  • 替换类的构造函数。这样就可以使用IoC(Inversion Of Control
  • 如果您的应用程序使用IoC,则可以轻松编写单元测试。由于您的代码是松耦合的
  • 推迟类的具体实现。因此可以在运行时确定类的类型。

例如:

public YourClass(IYourDependency dep) { }

然后您可以使用工厂创建依赖项:

var dep = new FanFactory.CreateFan(...)// An example of IoC
var cl = new YourClass(dep);

然后您可以在单元测试中模拟依赖项:

var dep = new Mock<IYourDependency>().Object;
var cl= new YourClass(dep);

答案 1 :(得分:3)

您是对的,因为工厂静态地绑定到其实例化的类型,所以工厂本身会破坏OPEN / CLOSED原理。在抽象工厂中也会发生同样的情况,因为您仅引入了更高级别的抽象。不是由工厂决定要创建的类型,而是由创建工厂的代码决定。

但是实际上您必须在某处执行切换。该代码可能会破坏一些原则。这是您在编程中经常要做的一个权衡。但是,这被认为是低价以获得更高的收益:不必在引入新类型的任何地方更改每个客户代码,而只需在工厂内执行一次即可。因此,所有消费者代码都可以保持不变。

另一个优点是您的客户端代码完全不了解实际的类。它不需要知道它。实际上,实际的类甚至可以是任意的模拟。这样,即使依赖项(实现HISTCONTROL=ignoredups 的实际类)尚不存在或仅由另一个团队成员部分开发,您也可以测试客户端代码:

IFan