3分钟重温抽象工厂模式(电商高频使用)

来源:mikechen的互联网架构

抽象工厂模式(Abstract Factory)是一个比较复杂的创建型模式。

抽象工厂模式的工厂是抽象的,产品是抽象的,而且有多个产品需要创建。

这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品。

上一期,我们介绍了简单工厂模式和工厂方法模式,还没看过的小伙伴,可以点击下面链接查看:

1. 简单工厂模式

2. 工厂方法模式

这一期,我们来介绍抽象工厂模式。

mikechen, 10 2+40

便PDF 该 PD 2+50+80 7 23 


01
  抽象工厂




抽象工厂模式(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 类图。


04
  抽象工厂的优缺点


优点:

  • 抽象工厂模式具有工厂方法模式的优点,并且还可以在类的内部对产品族进行约束;

  • 增加新的产品族时,不需要修改原有系统,非常方便,符合开闭原则;

  • 具体类的创建实例过程与客户端分离,客户端通过工厂的抽象接口操纵实例,客户端并不知道具体的实现是谁。

缺点:

  • 增加新的产品族时,需要修改抽象工厂和所有的具体工厂。

 


05
  抽象工厂的应用场景


以下场景中,可以考虑使用抽象工厂模式:

  • 一个系统不依赖于产品线实例如何被创建、组合和表达的细节;

  • 系统中有多于一个的产品线,而每次只使用其中某一产品线;

  • 一个产品线(或是一组没有任何关系的对象)拥有相同的约束。

需要注意的是,使用抽象工厂模式,一般要满足以下条件:

  • 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品;

  • 系统一次只可能消费其中某一族产品,即同族的产品一起使用。

 


总结
 


通过本文,我们了解并掌握了抽象工厂模式的概念、结构、原理、使用、优缺点等。

抽象工厂模式工厂方法模式的升级版本,抽象工厂模式和工厂方法模式的构成一样,,但它的方法个数、抽象产品的个数不同。

相较工厂方法模式,抽象工厂模式要解决的问题更为复杂。工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

以上,就是关于抽象工厂模式的全部介绍。


请使用浏览器的分享功能分享到微信等