设计模式之抽象工厂模式

Posted ProChick

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之抽象工厂模式相关的知识,希望对你有一定的参考价值。

1.简要概述

  • 抽象工厂模式就是提供一个接口,用来创建相关联的对象家族,也就是很多对象而不是一个对象并且这些对象是相关的,而简单工厂模式和工厂方法模式只是用于创建一个对象。
  • 抽象工厂模式中,其内部创建单个对象时用到的仍然是工厂方法模式,所以其单个实例创建流程和工厂方法模式大体一致,不同的是在客户端进行调用的时候,会调用该工厂的多个方法创建多个相关联的对象。
  • 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象家族是一种非常好的解决方式。
  • 抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。

2.模式结构

👉通常由一个抽象工厂父类( 负责定义创建所有工厂子类实例的接口 ),多个具体工厂子类( 负责实现创建产品子类实例的内部逻辑 ),多个抽象产品类( 负责定义创建所有相关产品子类实例的接口 ),多个具体产品类( 具有不同实现的产品子类 ),一个客户类( 负责调用来创建指定的某种产品族 )共同组成。

3.实现代码

举例 💡 :假设一个汽车工厂可以创建好质量的汽车和差质量的汽车,而好质量的汽车又需要好的汽车引擎和好的车座共同组成,差质量的汽车需要差的汽车引擎和差的车座共同组成,那么这个创建好汽车或者差汽车的流程我们就可以采用抽象工厂模式来实现。

抽象产品类

// 汽车引擎抽象类
public abstract class Engine{
    void printName();
}

// 汽车车座抽象类
public abstract class Seat{
    void printName();
}

具体产品子类

// 汽车引擎实现类1
public class GoodEngine extends Engine{
    public void printName(){
        System.out.println("这是好的汽车引擎");
    }
}

// 汽车引擎实现类2
public class BadEngine extends Engine{
    public void printName(){
        System.out.println("这是差的汽车引擎");
    }
}


// 汽车车座实现类1
public class GoodSeat extends Seat{
    public void printName(){
        System.out.println("这是好的汽车车座");
    }
}

// 汽车车座实现类2
public class BadSeat extends Seat{
    public void printName(){
        System.out.println("这是差的汽车车座");
    }
}

抽象工厂类

// 汽车工厂抽象类
public abstract class CarFactory{
    public abstract Engine createEngine();
    public abstract Seat createSeat();
}

具体工厂子类

// 好的汽车工厂
public class GoodCarFactory extends CarFactory{
    public Engine createEngine(){
        return new GoodEngine();
    }
    
    public Seat createSeat(){
        return new GoodSeat();
    }
}

// 差的汽车工厂
public class BadCarFactory extends CarFactory{
    public Engine createEngine(){
        return new BadEngine();
    }
    
    public Seat createSeat(){
        return new BadSeat();
    }
}

客户类

// 测试客户端
public class CarClient{
    public static void main(String[] args) {
        // 创建好的汽车引擎和车座
        CarFactory carFactory1 = new GoodCarFactory();
        
        Engine engine = carFactory1.createEngine();
        Seat seat = carFactory1.createSeat();
        engine.printName();
        seat.printName();
        
        
        // 创建差的汽车引擎和车座
        CarFactory carFactory2 = new BadCarFactory();
        
        Engine engine = carFactory2.createEngine();
        Seat seat = carFactory2.createSeat();
        engine.printName();
        seat.printName();
    }
}

4.优点好处

  • 可以使代码之间进行解耦,这里就将客户类和具体子类进行了解耦,客户类不再需要知道有哪些子类以及它们各自的实现细节。
  • 可以使代码更加易于维护,当某些子类发生改变时,客户类不需要进行修改。
  • 增加新产品族的时候,也不需要修改原有工厂子类的逻辑代码,只需增加对应的产品族子类和创建该产品族对象实例的工厂子类即可,满足OCP原则。

5.缺点弊端

  • 具体产品族子类较多的时侯,相应的工厂子类也会跟着增加,所以增加了系统的复杂程度。
  • 为产品族中增加新产品的时候,需要修改原有抽象工厂类和具体工厂子类的逻辑代码,不满足OCP原则。

6.应用场景

  • 当系统中要求某些相关对象需要一同被创建实例化的时侯使用。
  • 当系统中有关于某种事物可以提供多种产品链进行实现的时候使用。

7.应用示例

JDK源码中的TransformerFactory类

抽象工厂类中定义了两个抽象方法,用于创建两个不同的对象

然后两种不同实现的工厂子类分别重写该方法创建相应对象


8.三种形式的工厂模式之间的关系

  • 当抽象工厂模式中每一个具体工厂类只创建一个产品对象时,那么抽象工厂模式就退化成了工厂方法模式。
  • 当工厂方法模式中抽象工厂与具体工厂进行合并,只提供一个统一的接口来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式就退化成了简单工厂模式。

以上是关于设计模式之抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之抽象工厂模式

创建型模式之抽象工厂模式实例及代码操作

设计模式探秘之抽象工厂模式

设计模式之简单工厂工厂方法抽象工厂

设计模式之抽象工厂模式

设计模式之抽象工厂模式