【设计模式】工厂三模式(创建型)

引言


在面向对象编程中, 最通常的方法是通过new操作符产生一个对象实例,但是如果我们把这些创建对象的工作都放到客户端代码中完成,那么后期代码的维护和修改就会变得很复杂,为了解决这些问题,通过建立工厂来完成对象的创建。

描述


在工业革命之前,没有出现工厂,我们如果需要一张八仙桌的话,可能的做法是自己造一张。

简单工厂模式:有了一家生产桌子的工厂,该工厂不仅可以生产八仙桌,还能生产圆桌等。只需要告诉工厂,我要一张八仙桌,那么工厂会替我们生产,只要拿过来使用就可以。

工厂方法模式:现在工厂成为一个抽象的概念,它底下有八仙桌工厂、圆桌工厂等来生产具体的产品。如果我们需要八仙桌的话,得具体指定八仙桌工厂来为我们生产八仙桌。

抽象工厂模式:现在我们不仅想要八仙桌还想要太师椅,工厂只能生产桌子满足不了我们的要求,所以需要添加椅子的生产,同样,不仅可以生产太师椅还能生产其他的椅子。

简单工厂


Simple Factory:建立一个工厂(一个函数或一个类方法)来制造新的对象。 又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。可以看作工厂方法模式的一种特例,两者归为一类。

优点

从名字上就可以知道,这个模式很简单。工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

缺点

工厂类集中了所有实例的创建逻辑,不符合高内聚,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。违背了开放-封闭原则。

使用场景

工厂类负责创建的对象比较少; 客户只知道传入工厂类的参数, 一般只在很简单的情况下应用。


工厂方法


Factory Method:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。



优点

和简单工厂相比,工厂方法符合开放-封闭原则,既保持了简单工厂的优点,又克服了它的缺点。

缺点

每增加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。

使用场景

第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,而不需要知道对象的创建过程。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。

抽象工厂


Abstract Factory:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。



优点

易于交换产品系列。

缺点

难以支持新种类的产品。

使用场景

系统中有多个产品族。

联系


从简单工厂到工厂方法再到抽象工厂,这三种模式逐步抽象,并且更具一般性。




工厂方法模式:

一个抽象产品类,可以派生出多个具体产品类。
一个具体工厂类。

工厂方法模式:

一个抽象产品类,可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类可以创建多个具体产品类的实例。   

区别



简单工厂模式只有一个抽象产品类,并且没有抽象工厂。

工厂方法模式只有一个抽象产品类,和简单工厂相比,拥有抽象工厂。

抽象工厂模式有多个抽象产品类,并且具有抽象工厂。


小结


文章开头的部分,桌子和椅子的例子是当时自己的理解,可能不是很合适,如果理解有错误或者不恰当还请大家指出来。

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值