大家好,欢迎来到程序视点!今天要分享的是工厂模式的最后一种模式:抽象工厂模式
。
前言
在上一篇文章:设计模式之工厂方法模式 最后,我们通过示例展示了两个问题。归纳起来就是:
- 每次增加一个产品时,都需要增加一个具体类和一个对象实现工厂。
随着产品类的增多,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
- 对于某些可以形成产品族(一组产品)的情况处理比较复杂
由于工厂方法模式中,一个具体工厂类只生产一类具体的对象,导致相关的产品系列之间在组装匹配的时候出现问题。
当我们考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产时,就形成了抽象工厂模式的基本思想。
抽象工厂模式简介
抽象工厂模式,就是为了创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
这“一组相关或相互依赖的对象”来自不同的接口或抽象类。而这个抽象工厂要提供这些不同接口或抽象类的实例对象。
一个工厂提供多个实例对象,且这些实例间相互关联或相互依赖
抽象工厂模式,可以看做是工厂方法模式的升级版,从生产一个产品,到生产一系列的产品。
来看看抽象工厂模式包含的几个角色:
- 产品族抽象工厂:用来声明生成抽象产品的方法。
- 产品族工厂:专门生产一组相关的具体产品的工厂类。
- 产品抽象类:工厂类能创建出来的所有产品类的抽象。它负责描述所有实例所共有的公共接口。(这里必须要一个抽象类,不然不能保证返回的不同的产品类属于同一个类型)
- 产品类:工厂类创建出来的目标。它(们)是产品抽象类的具体实现。
示例
现在我们来修改之前“手机和电脑配对”的代码。
先来看下抽象工厂
public interface SameBrandFactory { public Phone createPhone(); public Computer createComputer();}
接着是工厂实现类:
华为品牌的工厂类:
public HuaweiFactory implements SameBrandFactory { public Phone createPhone() { return new HuaweiPhone(); } public Computer createComputer() { return new HuaweiComputer(); }}
苹果品牌的工厂类:
public AppleFactory implements SameBrandFactory { public Phone createPhone() { return new ApplePhone(); } public Computer createComputer() { return new AppleComputer(); }}
现在我们来测试下:
public class Test { public static void main(String[] args) { HuaweiFactory huaweiFactory = new HuaweiFactory(); Phone phone1 = huaweiFactory.createPhone(); Computer computer1 = huaweiFactory.createComputer(); // 匹配 match(phone1, computer1); AppleFactory appleFactory = new AppleFactory(); Phone phone2 = appleFactory.createPhone(); Computer computer2 = appleFactory.createComputer(); // 匹配 match(phone2, computer2); } public static void match(Phone p, Computer c) { System.out.println(p.info() + "===" + c.getName()) }}
输出:
我是华为手机===我是华为电脑
我是苹果手机===我是苹果电脑
看见了吗?同一个工厂出来的手机和电脑一定是匹配的!
抽象工厂模式总结
抽象工厂模式只有在新增一个类型的具体产品时才需要新增工厂实现类。它可以创建属于一类类型的多种具体产品。
当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。同时,使得系统结构更加稳定。
最后,需要给大家说明下抽象工厂模式中的“开闭原则”的倾斜性特点
。
在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦。产品等级结构间的约束或关联性,会要求设计人员在设计之初就要考虑全面。
如果在设计完成之后向系统中增加新的产品等级结构,或删除已有的产品等级结构,那将会导致系统出现较大的修改,为后续维护工作带来诸多麻烦。
🆗,到目前,我们已经把工厂模式的三种分类就讲解完成了。我们下期见。