温故而知新之——设计模式(四)

今天来看看工厂模式究竟是一个什么玩意,能生产什么,怎么生产。工厂模式和抽象工厂模式又有哪些区别。

  1. 工厂模式:

类型:创建型模式 ,定义一个常见产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类中。这满足创建型模式中所要求的“创建与使用相分离”的特点。

工厂模式的分类:

  1. 简单工厂模式(Simple Factory),又称静态工厂方法模式(Static Factory Method Pattern)。
  2. 工厂方法模式(Factory Method),又称多态性工厂模式(Polymorphic Factory)或虚拟构造器模式(Virtual Constructor)。
  3. 抽象工厂模式(Abstract Factory),又称工具箱模式(Kit或Toolkit)。

简单工厂模式(Simple Factory)是由一个工厂类传入的参数,动态决定应该创建哪一个产品类的实例,这些产品类继承同一个父类或接口。简单工厂模式一般又称静态工厂方法模式(Static Factory Method),它属于类创建模式,但它不属于23种经典设计模式。

 

优点:工厂类是整个模式的关键。包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体的对象。使用工厂类,外界可以从直接创建具体产品对象的繁琐局面摆脱出来。仅需要负责“消费”对象,而不必管这些对象究竟如何创建及如何组织的。明确了各自的自责和权利,有利于这个软件体系结构的优化。

 

缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类,这违背了开闭原则。当系统中的具体产品类不断增多的时候,可能就会要求工厂类根据不同条件创建不同实例的需求。这将会导致各种条件的判断,以便选择具体的产品类型进行实例化。很容易导致工厂类变得臃肿,功能模块不断蔓延。对系统的维护和扩展非常不利。

 

使用场景:

工厂类负责的对象比较少;

客户只希望负责调用,对如何创建对象和对象内的实现逻辑并不关心;

 

工厂方法模式(Factory Method)与简单工厂模式相比,为了解决工程类中耦合的问题,将原有的实例创建逻辑推迟到子类中。核心工厂类不再负责产品的创建,核心类成为一个抽象工厂角色,仅负责声明接口。这样做的好处是在不修改具体工厂角色的情况下引入新产品。

 

优点:

继承了简单工厂模式的优点,符合开闭原则。

 

缺点:

增加产品,需要增加对应的新的工厂类。这将会导致系统类个数成对增加,在一定程度上增加了系统的复杂性。

抽象工厂模式(Abstract Facotry Pattern)提供一个创建一系列相关或相互依赖对象的的接口,而无须指定他们的具体类。抽象工厂模式又称为Kit模式,属于对象创建模型。

 

模式动机:

在工厂方法模式中具体工厂负责生产具体的产品,每个具体工厂对应一种具体的产品,工厂方法也有唯一性。

 

 

简单工厂模式

简单工厂模式不是 23 种里的一种,简而言之,就是有一个专门生产某个产品的类。

比如下图中的鼠标工厂,专业生产鼠标,给参数 0,生产戴尔鼠标,给参数 1,生产惠普鼠标。

https://i-blog.csdnimg.cn/blog_migrate/7577e6477f106e386cac642f269b6321.png

工厂模式

工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口。

戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。

生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建。

后续直接调用鼠标工厂.生产鼠标()即可

https://i-blog.csdnimg.cn/blog_migrate/fdb03bf64eec189f36d4f51d7a44cc96.png

抽象工厂模式

前面介绍的工厂方法模式中考虑的是一类产品的生产,鼠标厂只生产鼠标。但是现实生活中许多工厂是综合型的工厂,能生产许多种类的产品,如电子设备加工厂即能生产鼠标又能生产键盘。

下面来介绍抽象工厂模式,抽象工厂模式将考虑多等级产品的生成,也就是要不仅生产鼠标,同时也要生产键盘。将同一个具体工厂生成的位于不同等级的产品作为 一个产品族存在。

 

也就是 PC 厂商是个父类,有生产鼠标,生产键盘两个接口。

戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。

创建工厂时,由戴尔工厂创建。

后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。

https://i-blog.csdnimg.cn/blog_migrate/455d0b2570c66ca47009fdd445d99293.png

在抽象工厂模式中,假设我们需要增加一个工厂

假设我们增加华硕工厂,则我们需要增加华硕工厂,和戴尔工厂一样,继承 PC 厂商。

之后创建华硕鼠标,继承鼠标类。创建华硕键盘,继承键盘类即可。

https://i-blog.csdnimg.cn/blog_migrate/23e4c2189b98d19b5eba79c95f917da6.png

在抽象工厂模式中,假设我们需要增加一个产品

假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。

之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。 以上。

https://i-blog.csdnimg.cn/blog_migrate/52e1a220f2c17db61da1ca5593428dec.png

 

 

抽象工厂模式一般要满足:

系统中有多个产品族,每个具体工厂创建同一族但属于不同等级的产品。

系统一次只可能消费其中某一族产品,即同族产品一起使用。

 

抽象工厂模式优点:

可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。

当增加一个新的产品族时不需要修改源代码,满足开闭原则。

 

缺点是:

当产品族中需要增加一个新产品时,所有的工厂类都要进行修改。

 

模式的扩展

抽象工厂的扩展性有一定的“开闭原则”倾斜性:

  1. 当增加一个新的产品族时只需要增加一个新的具体工厂,不需要修改源代码,满足开闭原则。
  2. 当产品族需要增加一个新种类的产品时,则所有的工厂类都 要进行修改,不满足开闭原则。

必须要提一下,如果系统中只存在一个等级结构的产品时,抽象工厂模式将退化到工厂方法模式。

 

最后:

生活之所以累,一半源于生存,一半源于攀比。但求自己每日精进,不要被别人所诱惑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蒋聊技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值