3分钟重温抽象工厂模式(电商高频使用)
来源:mikechen的互联网架构
抽象工厂模式(Abstract Factory)是一个比较复杂的创建型模式。
抽象工厂模式的工厂是抽象的,产品是抽象的,而且有多个产品需要创建。
这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品。
上一期,我们介绍了简单工厂模式和工厂方法模式,还没看过的小伙伴,可以点击下面链接查看:
1. 简单工厂模式
2. 工厂方法模式
这一期,我们来介绍抽象工厂模式。
大家好,我是mikechen,本文是《深入浅出设计模式》的第10篇。刚结束的设计模式系列篇:七大设计原则(2万+字、40多张图解),大家反响还不错。
为方便学习,我已将全部内容更新到《深入浅出设计模式》PDF了,该 PDF 目前有2+万字,50+张图解,80多页,内容涵盖设计模式的7大原则、23种设计模式。图文并茂非常详细,夯实基础、复习备面都用得上,需要的同学文末自取。
抽象工厂模式(AbstractFactory)是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
02抽象工厂模式的结构抽象工厂模式由抽象工厂、具体工厂、抽象产品、具体产品构成。
抽象工厂(AbstractFactory):声明了用来创建不同产品的方法。
具体工厂(ConcreteFactory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
抽象产品(AbstractProduct):为每种产品声明业务方法。
具体产品(Product):定义具体工厂生产的具体产品,并实现抽象产品中定义的业务方法。它同具体工厂之间是多对一的关系。
03抽象工厂模式的实现假设:
华为和小米生产的手机,分为两条产品线,一个是老人手机,一个是学生手机。
为了解决增加产品线的问题,我们用抽象工厂模式来实现。
首先,定义抽象产品类:
public abstract class Dumbphone { public abstract void start();}public abstract class Studentphone { public abstract void start();}两个抽象产品类 Dumbphone 、 Studentphone ,分别用来定义两个产品线老人手机、学生手机,它们都定义了 start 方法,用来启动手机。
具体产品是华为、小米的老人手机和学生手机:
public class HuaWeiDumbphone extends Dumbphone { @Override public void start() { System.out.println("华为老人手机启动"); }}public class XiaoMiDumbphone extends Dumbphone { @Override public void start() { System.out.println("小米老人手机启动"); }}public class HuaWeiStudentphone extends Studentphone{ @Override public void start() { System.out.println("华为学生手机启动"); }}public class XiaoMiStudentphone extends Studentphone{ @Override public void start() { System.out.println("小米学生手机启动"); }}接着创建生产电脑的抽象工厂:
public abstract class PhoneFactory { public abstract Dumbphone createDumbphone(); public abstract Studentphone createStudentphone();}上面定义了两个方法,分别用来生产老人手机和学生手机。
定义华为和小米工厂(具体工厂):
public class HuaWeiFactory extends PhoneFactory { @Override public Dumbphone createDumbphone() { return new HuaWeiDumbphone(); } @Override public Studentphone createStudentphone() { return new HuaWeiStudentphone(); }}public class XiaoMiFactory extends PhoneFactory { @Override public Dumbphone createDumbphone() { return new XiaoMiDumbphone(); } @Override public Studentphone createStudentphone() { return new XiaoMiStudentphone(); }}华为工厂和小米工厂用来生产老人手机和学生手机这两个不同产品线的手机。
最后编写客户端(客户端调用):
public class Client { public static void main(String[]args) { PhoneFactory HuaWeiFactory=new HuaWeiFactory(); HuaWeiFactory.createDumbphone().start(); HuaWeiFactory.createStudentphone().start(); PhoneFactory XiaoMiFactory=new XiaoMiFactory(); XiaoMiFactory.createDumbphone().start(); XiaoMiFactory.createStudentphone().start(); }}分别用 HuaWeiFactory 和 XiaoMiFactory 来生产老人手机、学生手机,调用 start 方法启动它们。
运行结果:
华为老人手机启动华为学生手机启动小米老人手机启动小米学生手机启动为了便于理解,我画了一张这个例子的 UML 类图。
优点:
抽象工厂模式具有工厂方法模式的优点,并且还可以在类的内部对产品族进行约束;
增加新的产品族时,不需要修改原有系统,非常方便,符合开闭原则;
具体类的创建实例过程与客户端分离,客户端通过工厂的抽象接口操纵实例,客户端并不知道具体的实现是谁。
缺点:
增加新的产品族时,需要修改抽象工厂和所有的具体工厂。
05抽象工厂模式的应用场景以下场景中,可以考虑使用抽象工厂模式:
一个系统不依赖于产品线实例如何被创建、组合和表达的细节;
系统中有多于一个的产品线,而每次只使用其中某一产品线;
一个产品线(或是一组没有任何关系的对象)拥有相同的约束。
需要注意的是,使用抽象工厂模式,一般要满足以下条件:
系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品;
系统一次只可能消费其中某一族产品,即同族的产品一起使用。
总结通过本文,我们了解并掌握了抽象工厂模式的概念、结构、原理、使用、优缺点等。
抽象工厂模式是工厂方法模式的升级版本,抽象工厂模式和工厂方法模式的构成一样,,但它的方法个数、抽象产品的个数不同。
相较工厂方法模式,抽象工厂模式要解决的问题更为复杂。工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
以上,就是关于抽象工厂模式的全部介绍。
扫一扫,关注我们