一文搞懂设计模式--抽象工厂(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.开源架构中哪些使用了这一模式?

未完待续......



相关文章
|
1月前
|
设计模式
设计模式之抽象工厂
设计模式之抽象工厂
|
3月前
|
设计模式 Java
常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)
有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式)
39 2
|
3月前
|
设计模式
设计模式-抽象工厂
设计模式-抽象工厂
|
6月前
|
设计模式 架构师
设计模式之抽象工厂
设计模式之抽象工厂
|
1月前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
21 1
|
3月前
|
设计模式 Java 数据库连接
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。那么三者有什么区别呢?
99 1
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
|
3月前
|
设计模式 安全 数据库
创建型设计模式-单例模式/工厂模式/抽象工厂
创建型设计模式-单例模式/工厂模式/抽象工厂
37 0
|
4月前
|
设计模式 SQL 数据库连接
设计模式之抽象工厂模式--创建一系列相关对象的艺术(简单工厂、工厂方法、到抽象工厂的进化过程,类图NS图)
设计模式之抽象工厂模式--创建一系列相关对象的艺术(简单工厂、工厂方法、到抽象工厂的进化过程,类图NS图)
|
5月前
|
设计模式 Java 程序员
认真学习设计模式之工厂模式(Factory Pattern)
认真学习设计模式之工厂模式(Factory Pattern)
34 0
|
6月前
|
设计模式 Java
设计模式6 - 抽象工厂模式【Abstract Factory Pattern】
设计模式6 - 抽象工厂模式【Abstract Factory Pattern】
20 0