无代码!几张图看懂工厂模式区别,与抽象工厂的局限性

工厂模式的逻辑作用,跟new一个对象没什么不同,那为什么要用工厂模式呢。这可能是第一次接触工厂时,会产生的第一个问题了。

从笔者的角度,工厂模式作用体现在以下两点

  • 同一类型的对象采用工厂是最常见的做法,不仅代码上很容易表明这是同一种类型。且工厂一般设计为返回对象的抽象(父类/接口),对对象调用也是很好的规范。
  • 封装复杂建造过程,把对象的建造分离出来,调用工厂中的方法会显得简单快捷。

工厂模式大体上会分有几类,但实际上很简单,一起看下吧~


一、工厂的本质

我们说,工厂模式的本质就是通过一个工厂创建对象,来取代new的方式。根据依赖倒置的设计原则,产品和工厂都应该有其抽象类或接口。

依赖倒置不完全解释:对象调用时应该调用其抽象(父类/接口)。

所以理解下,工厂模式的区别在于设计原则的运用而已。

1.1多工厂结构:
多工厂结构
多工厂是每个对象都有一个对应的工厂,工厂实现同一个接口。

1.2 简单工厂结构:
简单工厂结构
简单工厂是通过一个工厂类来创建一个或多个不同的对象。

二、抽象工厂

普通工厂的数据是一维的,如产品分为:产品1,产品2,产品3.

抽象工厂是二维的,比如产品如果除了1,2,3的区分,还有一档,二挡质量的区别。来画个图

产品 产品1 产品2 产品3
一档 一档-产品1 一档-产品2 一档-产品3
二挡 二挡-产品1 二挡-产品2 二挡-产品3

抽象工厂通过其中一个维度建立工厂,根据这一维度创建的工厂类来设置创建不同对象的方法。

抽象工厂结构:
抽象工厂结构
注意编码时跟普通工厂的区分,因为对象种类是二维的,对象可能有多重继承的情况。

三、抽象工厂的局限

一般资料上会说抽象工厂的局限在于扩展性很差,笔者认为这个说法是不完全的。

抽象工厂的特点应该概括为: 工厂类别的扩展很容易,工厂类中对象的种类扩展很难。

比如,我们在添加第三档产品时是容易的,不改变原有代码,添加第三档工厂实现工厂接口就好了。但如果要增加 产品4,就需要把所有工厂中添加一个 产品4的创造方法。

工厂类别扩展
工厂类别扩展动画
工厂类别的扩展容易,只需要添加一个新的工厂就好了。

产品种类扩展
产品种类扩展
对产品种类扩展不友好,每个工厂类都要修改。


写在最后

文章开头说,工厂模式的本质就是用工厂类取代了new的创建。

换句话说,所有以此方法来创建对象的方式,笔者认为都可以称为工厂模式,其余的所有变化只是设计原则的体现罢了。理解这一点,工厂模式的类别区分就很简单了。

发布了12 篇原创文章 · 获赞 36 · 访问量 4774

猜你喜欢

转载自blog.csdn.net/weixin_42229694/article/details/103712382