写点什么

3. 抽象工厂模式

作者:下雨了
  • 2022 年 4 月 03 日
  • 本文字数:1942 字

    阅读完需:约 6 分钟

概念及定义

抽象工厂模式提出更了一种生产同一系列的各类产品的思想,一个抽象工厂中定义了一系列不同的产品,在一个固定的工厂实现类中,你可以生产的产品都是由工厂实现类内部决定的。

类似于 apple 的 appstore。在 MAC 的 appstore 中搜索应用的结果会有 Mac App/IPhone 与 IPad APP 两个标签页。其中 Mac APP 中可以有 QQ,微信等应用。IPhone 与 IPad APP 中也可以有 QQ,微信等应用。假设你有一台 Mac 你大多数时候应该只关心 Mac APP 这个标签,因为你只需要 Mac 系列的应用。这个例子中 appstore 作为一个抽象工厂,Mac App/IPhone 与 IPad APP 作为他的两个具体实现类。一个为我们提供适用于 mac 的 app,另一个为我们提供适用 IPhone 与 IPad 的 app。这样的话,可以清晰的为用户提供适配的产品类型。


抽象工厂模式的主要思想

通过定义抽象工厂类中的具体公共方法,来定义可以生产的产品。不同系列的工厂实现类,可以为这些公共产品赋予独有的特性:开头例子中的适用平台。用户通过指定的工厂实现类可以生产出指定特性的产品。


抽象工厂模式中角色以及职责

  1. AbstractFactory(抽象工厂角色)

定义工厂的公共生产方法。


  1. Factory(工厂实现角色)

对公共生产方法重写,实现对应指定产品实现的生产。


  1. AbstractProduct(抽象产品角色)

定义产品的公共方法。


  1. Product(产品实现角色)

对公共方法重写,实现产品的独有特性。


抽象工厂模式的优缺点

优点:

  1. 单一职责,工厂类负责产品对象的创建。

  2. 调用者只需要关心产品对应的工厂类,即可以创建出对应的具体产品,而不需要了解具体的产品类。

  3. 与简单工厂模式进行对比,在新增产品类别的时候,无需修改已有代码,直接新增对应的产品类与对应的产品工厂类即可,降低了耦合性。

  4. 对于一些根据特定环境,需要由不同特性的组件来实现的业务中,可以起到很大的作用。

缺点:

  1. 增加新产品的时候,需要在抽象工厂类中添加对应方法,各个工厂具体实现类中也需要增加对应方法。


实现步骤:

  1. 定义抽象产品接口:

public interface ICar {    void drive();}
复制代码


public interface IEngine {    void start();}
复制代码
  1. 定义抽象工厂类:

public interface AbstractFactory {    ICar produceCar();
IEngine produceEngine();}
复制代码
  1. 定义具体产品实现类与具体工厂实现类:

public class TeslaCar implements ICar{    @Override    public void drive() {        System.out.println("Tesla 滴滴滴");    }}
复制代码


public class TeslaEngine implements IEngine{    @Override    public void start() {        System.out.println("Tesla 轰轰轰");    }}
复制代码


public class TeslaFactory implements AbstractFactory{    @Override    public ICar produceCar() {        return new TeslaCar();    }
@Override public IEngine produceEngine() { return new TeslaEngine(); }}
复制代码


public class VolkswagenCar implements ICar{    @Override    public void drive() {        System.out.println("Volkswagen 滴滴滴");    }}
复制代码


public class VolkswagenEngine implements IEngine{    @Override    public void start() {        System.out.println("Volkswagen 轰轰轰");    }}
复制代码


public class VolkswagenFactory implements AbstractFactory{    @Override    public ICar produceCar() {        return new VolkswagenCar();    }
@Override public IEngine produceEngine() { return new VolkswagenEngine(); }}
复制代码


public class AbstractFactoryPattern {    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {        Class<?> FactoryClazz1 = Class.forName("VolkswagenFactory");        AbstractFactory carFactory1 = (AbstractFactory)FactoryClazz1.newInstance();        ICar volkswagenCar = carFactory1.produceCar();        IEngine volkswagenEngine = carFactory1.produceEngine();        //生产出来的产品都是大众系的        volkswagenCar.drive();        volkswagenEngine.start();        Class<?> FactoryClazz2 = Class.forName("TeslaFactory");        AbstractFactory carFactory2 = (AbstractFactory) FactoryClazz2.newInstance();        ICar teslaCar = carFactory2.produceCar();        IEngine teslaEngine = carFactory2.produceEngine();        //生产出来的产品都是特斯拉系的        teslaCar.drive();        teslaEngine.start();    }}
复制代码

总结:

由测试结果可见:

  1. 同一共产生产的产品,都是由工厂定义的同一系列的产品。

  2. 抽象工厂模式即实现:通过获取工厂类名,利用反射,即可得到对应的工厂实现类来生产对应的一系列产品。

发布于: 刚刚阅读数: 2
用户头像

下雨了

关注

还未添加个人签名 2021.05.11 加入

还未添加个人简介

评论

发布
暂无评论
3.抽象工厂模式_设计模式_下雨了_InfoQ写作平台