工厂模式负责将大量有共同接口的类实例化,可以动态决定将那一个类进行实例化,主要有以下三种形式:
简单工厂模式
又称静态工厂方法,该方法很简单,即一个工厂直接生产所有的产品,有且仅有这一个工厂。
简单工厂.png
可以发现,里面有三个类:工厂类,具体产品类,抽象产品类,由传入工厂类的参数决定所生产的产品。
simplefactory.png
优点:
所有的运行逻辑都在工厂类中,而客户端只需要消费产品,实现了责任分割。
缺点:
1)运行逻辑过于集中,当工厂类出问题,整个系统瘫痪。
2)面对复杂多变的产品类及其接口种类,系统在进行拓展时较为困难。
3)采用静态方法作为工厂方法,无法由子类继承形成等级结构,拓展困难。
应用:
DateFormat类,
工厂方法模式
抽象出一个工厂接口,将实际生产工作放到具体的工厂中去,也就是由工厂做大了,由一个厂房变成了多个厂房,每个厂房负责对应相关产品的生产。
工厂模式.png
因为抽象出了工厂接口,所以与简单工厂相比,多了抽象工厂角色。
该方法适用于每个工厂只生产一种产品的情况,当产品增加时,只需增加相应工厂即可,保持了"开-闭"原则。
1
2
抽象工厂模式
处理一个工厂对应多个产品的情况,同时一个产品也可以对应多个工厂。
1.png
2.png
该模式对新增产品无力,但解决了产品族增加问题。
应用范围:
-当系统中的产品有多于一个产品族,而系统只消耗其中某一类的产品时(如键盘分硬轴、轻轴,一工厂只生产轻轴,另一工厂生产硬轴)。
-系统不应当依赖于产品类实例如何创建、组合等细节。
三者区别
从工厂的应用范围讲:
简单工厂1......N产品
工厂模式1.....1产品
抽象工厂M....N产品
从产品细节讲:
简单工厂下,一工厂直接生产具体的产品,如白菜,菠菜,土豆。
工厂模式下,一工厂生产根菜类还是茎菜类蔬菜。
抽象模式下,一工厂生产夏季蔬菜或者冬季蔬菜,夏季/冬季同时包括根菜类和茎菜类蔬菜,同时根菜类蔬菜能够被多个工厂生产。
三者从上向下更具有泛化性。