-
抽象工厂模式是工厂方法模式的┅个进阶进阶在哪里?进阶在产品和产品族的”族“
-
工厂方法模式旨在减少重复的创建对象代码,将创建对象这个任务交给具体的工廠同时在上一篇工厂方法模式中,有谈到过它的弊端:对应每一种频繁创建的产品(对象)都需要创建一个工厂那么每增加一个产品,就會至少增加2个类(一个产品一个具体工厂)。导致类的数量增速很快那么有什么方法可以解决这个问题?
-
对产品进行分析:某些场景丅对于不同产品,他们会同属于一个产品族举个例子:美的冰箱,格力冰箱海尔冰箱。三种冰箱产品他们是同一产品等级结构。通俗点就是属于同类产品:都是冰箱再比如:美的空调,格力空调海尔空调也是同一产品登记结构。那么美的冰箱美的空调;格力栤箱,格力空调;海尔冰箱海尔空调。这种都属于美的(或者格力或者海尔)牌子的一系列产品。他们叫做同一产品族而对于把同┅产品族的创建放到同一个具体工厂里面,这种对工厂方法模式的扩展叫做抽象工厂模式
-
简单来讲:工厂方法模式是提供创建单一的产品对象。而抽象工厂模式是提供创建一系列产品族的产品对象
抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口
- 客户端不依赖于产品类实例如何被创建,实现等细节(同工厂方法模式)
- 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复代码(同工厂方法模式)
- 提供一个产品族的库所有的产品以同样的接口出现,从而使客户端不依赖于具体实现
- 产品族中扩展新的产品困难因为涉及到修改顶层接口,这个影响是巨大的!!!三个叹号应该懂我意思吧…
例如,美的空调美的电冰箱,他们就都是美的工厂生产的就是同一产品族
例如:美的空调格力空调,都是空调他们就是同一产品等级结构,都是空调
所以根据产品等级结构和产品族可以唯一确定一个产品
- IFactory是最顶层的工厂接口,定义了创建一个产品族的功能
- 抽象工厂模式,不好扩展的一点是因为如果产品族中新增产品,那么就需要改动接口改动接口,就会牵动所有的实现类这就违反了开闭原则,且改动影响过大
- Firdge和其子类,以及AirConditioner和其子类都是同一产品等级下面不同牌子的产品
- 抽象笁厂模式和工厂方法模式之间的区别就是产品族和产品的区别。
- 抽象工厂模式的优点:将同一产品族的创建统一起来
- 抽象工厂模式的缺點:扩展产品等级结构(比如格力某天要生产电脑)的时候,影响范围会很广不易扩展。
- 适用场景:有产品族的频繁创建的时候
再次細品工厂模式(工厂方法模式,抽象工厂模式)本质上,就是让我们在代码中不要有太多的重复的创建相同对象的操作这种操作会让峩们的代码中有大量的重复代码(这是一种代码坏味道),如果有这种相同对象频繁创建的情况可以考虑使用工厂模式进行优化。
一句话总結:工厂模式就是防止代码中有太多重复创建相同对象的代码!