【设计模式】-工厂三兄弟

前言

   学习了创建型的模式之后,发现有三个兄弟,及其相似,可以说它们三个是一个迭代的过程、不断升级的过程,那就来仔细的了解一下他们的各个的优点吧。

简单工厂模式

   简单工厂模式就是把一些相似的东西拿出来,进行抽象,比如书上的例子,加减乘除,我们定义一个工厂类,他的作用就是根据客户传来的不同的指令来返回一个相应的算法。下面是简单工厂的结构图:
这里写图片描述

优点

   方便扩展算法,假如在增加一个算法,只需要增加一个子类继承简单运算类即可,客户端不知道工厂里具体的细节,只要给出相关指令,工厂就能马上给出相应的算法,增加了系统的灵活性。这样将对象创建和使用分离

缺点

   如上面结构图所示(红框的位置),在进行扩展的时候,我们要更改工厂函数里面的那个分支语句Switch,这样便破坏了封装性。不符合开闭原则。如果工厂的职责过多,逻辑复杂,不利于系统扩展和维护,使系统受到影响。

工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。下面是工厂方法模式的结构图:
这里写图片描述
   根据简单工厂模式的例子,用工厂方法模式来表示,结构图如下:
这里写图片描述

优点

   两个图作比较,可见工厂方法模式把算法实体的创建放到了工厂的子类中。符合开闭原则,新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可。符合单一职责原则,每个具体工厂类只负责创建对应的产品。工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。

缺点

   添加新的算法时,除了增加新产品类外,还要提供与之对应的集体工厂类,系统类的个数成对增加,增加了系统的复杂性,不便于维护。

抽象工厂模式

   提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。下面是抽象工厂的结构图:
这里写图片描述

优点

   用抽象工厂模式和工厂方法模式、简单工厂模式作比较,简单工厂模式,不符合开闭原则,而工厂方法模式正好弥补了简单工厂的缺陷,但是当扩展一种方法时,需要增加两个类,及其浪费资源,而抽象工厂模式正好弥补了工厂方法的缺点,如果我们增加一个算法时,只需要增加一个工厂类就可以。

缺点

   抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了开闭原则。

总结

   通过三个工厂比较,让我更深入的了解了他们的优缺点,这样对比的学习方法很不错,不断总结让知识颗粒归仓。

猜你喜欢

转载自blog.csdn.net/ywq1016243402/article/details/81914908