设计模式:学习笔记(6)——抽象工厂模式
设计模式:学习笔记(6)——抽象工厂模式
抽象工厂模式
在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂都对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。此时我们需要使用抽象工厂模式。
抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对同一产品“大类”,而抽象工厂模式可以生产多个产品“大类”。
说明:在这里呢,我们可以理解一个“大类”为一个抽象产品接口。
模式定义
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
这个概念依然抽象难懂,但是如果你已经阅读了工厂(方法)模式,那我们直接看类图即可更加容易理解。
抽象工厂模式中的角色与工厂方法相同,也是4个角色:
- 抽象工厂角色
- 具体工厂角色
- 抽象产品角色
- 具体产品角色
模式分析
优缺点
抽象工厂模式的主要优点依然是隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类创建多个“大类”的对象,增加大类和大类对象比较方便,但是还是需要修改抽象工厂和具体工厂的代码,违反了开闭原则。
模式应用
在很多软件系统中需要更换界面主题,要求界面中的按钮、文本框、背景色等一起发生改变时,可以使用抽象工厂模式进行设计。
实例
如下是一个抽象工厂模式的实例,现在抽象工厂可以生成多个产品“大类”
interface AbstractFactory{ Phone createPhone(String param); Mask createMask(String param); } class SuperFactory implements AbstractFactory{ @Override public Phone createPhone(String param) { return new iPhone(); } @Override public Mask createMask(String param) { return new N95(); } } interface Phone{ } class iPhone implements Phone{ } interface Mask{ } class N95 implements Mask{ }
参考资料
- https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html
- 《设计模式(Java版)》