设计模式之抽象工厂模式

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.三种形式的工厂模式之间的关系

  • 当抽象工厂模式中每一个具体工厂类只创建一个产品对象时,那么抽象工厂模式就退化成了工厂方法模式。
  • 当工厂方法模式中抽象工厂与具体工厂进行合并,只提供一个统一的接口来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式就退化成了简单工厂模式。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小吉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值