一文搞懂设计模式--抽象工厂(Abstract Factory)

简介: 一文搞懂设计模式--抽象工厂(Abstract Factory)

抽象工厂(Abstract Factory)


介绍


提供一个创建一系列相关或相互依赖对象的接口,无需指定它们具体的类;具体工厂负责实现具体产品。


看图说话


image.png


实例


抽象工厂


public interface AbstractFactory {
  //又能造汽车
    AbstractCar createProductCar();
  //还可以造口罩(Mask)
    AbstractMask createProductMask();
}

抽象出汽车接口


public interface AbstractCar {
    void run();
}

抽象出口罩接口


public interface AbstractMask {
    void defense();
}

分别做抽象产品的实现(汽车和口罩的实现)


//口罩的具体产品
public class N95 implements AbstractMask{
    @Override
    public void defense() {
        System.out.println("我N95防护非常快!");
    }
}
public class N100 implements AbstractMask{
    @Override
    public void defense() {
        System.out.println("我N100防护快的不得了!");
    }
}
//汽车的具体产品
public class BenchiCar implements AbstractCar{
    @Override
    public void run() {
        System.out.println("我是奔驰,我可以跑跳着跑!");
    }
}
public class WulingCar implements AbstractCar{
    @Override
    public void run() {
        System.out.println("我是五菱,我能飞!");
    }
}

对象工厂

因为工厂实现的是抽象工厂接口,抽象工厂又有多个产品接口,这样具体的工厂是不是就可以创建多个产品了呢?


public class CarFactory implements AbstractFactory{
    @Override
    public AbstractCar createProductCar() {
        return new BenchiCar();
    }
    @Override
    public AbstractMask createProductMask() {
        return new N95();
    }
}
public class MaskFactory implements AbstractFactory{
    @Override
    public AbstractCar createProductCar() {
        return new WulingCar();
    }
    @Override
    public AbstractMask createProductMask() {
        return new N100();
    }
}

客户端

客户端通过创建工厂就可以完成多种类产品的创建,这就是对象工厂带给我们的好处了


public class Client {
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        carFactory.createProductCar();
        carFactory.createProductMask();
    }
}


总结


1.使用场景

  • 需要多个系列产品
  • 系统需要提供一个产品库,所有产品都以同样的接口出现,客户端不需要依赖具体的实现
  • 如果要动态的切换产品簇

2.本质是什么?

  • 选择产品簇的实现。
  • 工厂方法是选择单个产品的实现,抽象工厂是为一个产品簇选择实现的,如果抽象工厂里只定义一个方法,那就是抽象方法模式了

3.它解决了什么问题?

将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。

使用者可以直接消费产品而不需要知道生产的细节

4.它体现了设计模式中什么原则?

  • 更符合开闭原则
  • 单一职责

5.存在的缺陷?

如果有新产品添加,那么就需要去修改抽象工厂的接口,这样就会抽象工厂类和下面的子类都会受到牵连

6.你认为与它相关的设计模式有哪些? 它们之间的区别有哪些?

抽象工厂和抽象方法最大的区别是,抽象工厂每个厂都可以创建多种类的产品;工厂方法没个厂只能建立一种产品

7.开源架构中哪些使用了这一模式?

未完待续......



相关文章
|
6月前
|
设计模式
设计模式之抽象工厂
设计模式之抽象工厂
|
6月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
4月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
41 3
|
5月前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
5月前
|
设计模式 Java
设计模式-抽象工厂(JAVA)
设计模式-抽象工厂(JAVA)
|
6月前
|
设计模式
设计模式之工厂 Factory
设计模式之工厂 Factory
49 1
|
6月前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
65 1
|
6月前
|
设计模式
设计模式(二)工厂方法模式(Factory Method)
设计模式(二)工厂方法模式(Factory Method)
34 0
|
6月前
|
设计模式 Java 数据库连接
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。那么三者有什么区别呢?
158 1
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别