一文了解抽象工厂模式

769 阅读4分钟

1.什么是抽象工厂模式

抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。的确是抽象工厂,光看概念就很抽象。了解抽象工厂模式前,先了解下抽象工厂引入的2个概念:产品族和产品等级结构

产品族,是指不同产品登记结构中,功能相关的产品组成的家族。

产品等级结构,即产品的继承结构,继承或实现同一抽象产品的具体产品属于同一产品等级结构。

简单来讲,就是下面这张图:小米家的相关的智能家居产品组成了一个产品族(智能音箱+智能台灯+其他),华为的组成另外一个产品族,而两家都拥有各自的台灯,就是产品等级结构。

2. 实现抽象工厂模式

既然抽象工厂模式设计产品族和产品等级结构的概念,那就需要定义特定的对象,实现这2个概念:

  • AbstractFactory:抽象工厂,负责定义产品族。
  • ConcreteFactory:具体工厂,负责生产实际的产品族对象。
  • AbstractProduct:抽象产品,负责定义产品等级结构。
  • ConcreteProduct::具体产品,负责生产具体的产品等级结构对象。

一、首先需要定义产品等级结构以及其具体对象

/*===首先定义2个产品等级结构:台灯和蓝牙音箱===*/
public interface Lamp {
    void open(); 
}
public interface BluetoothSpeaker {
    public void receive();
}
/*===然后定义具体对象===*/
public class HuaWeiBluetoothSpeaker implements BluetoothSpeaker {
    @Override
    public void receive() {
        System.out.println("华为音箱接受到命令...");
    }
}
public class HuaWeiLamp implements Lamp {
    @Override
    public void open() {
        System.out.println("打开华为台灯.");
    } 
}
public class MiBluetoothSpeaker implements BluetoothSpeaker {
    @Override
    public void receive() {
        System.out.println("小米音箱接受到命令...");
    }
}
public class MiLamp implements Lamp {
    @Override
    public void open() {
        System.out.println("打开小米台灯");
    }
}

二、有了产品等级结构,还需要产品族

/*===首先一个超级工厂,负责定义产品族===*/
public interface SmartHomeFactory {
    public BluetoothSpeaker productBoothSpeaker();
    public Lamp productLamp();
}
/*===然后定义具体工厂对象===*/
public class MiFactory implements SmartHomeFactory {
    @Override
    public BluetoothSpeaker productBoothSpeaker() {
        return new MiBluetoothSpeaker();
    }

    @Override
    public Lamp productLamp() {
        return new MiLamp();
    }
}

public class HuaWeiFactory implements SmartHomeFactory {
    @Override
    public BluetoothSpeaker productBoothSpeaker() {
        return new HuaWeiBluetoothSpeaker();
    }

    @Override
    public Lamp productLamp() {
        return new HuaWeiLamp();
    }
}

三、这样产品族和产品等级结构就完整了,业务流程直接调用对应的产品族功能

public class Test {
    public static void main(String[] args) {
     //华为智能家居产品族
        SmartHomeFactory hwshf = new HuaWeiFactory();
        BluetoothSpeaker bs= hwshf.productBoothSpeaker();
        bs.receive();
        Lamp lamp = hwshf.productLamp();
        lamp.open();
        
  //小米智能家居产品族
        SmartHomeFactory mishf = new MiFactory();
        BluetoothSpeaker mibs = mishf.productBoothSpeaker();
        mibs.receive();
        Lamp milamp = mishf.productLamp();
        milamp.open();
    }
}

从实现抽象工厂模式的过程看,抽象工厂模式的实现过程就3步:

1. 先定义产品等级结构和具体产品对象  
2. 定义超级工厂,通过工厂定义需要生产的产品族,然后通过具体的工厂,来生产具体的产品族对象。
3. 对外通过工厂来生产具体产品对象,外界无需知道具体的产生过程。

3. 抽象工厂模式实际场景

在实际业务中,如果系统有多个产品,并且每次只使用其中一个产品族,而且在业务过程中不依赖与产品实例如何被创建、组合和表达的细节,这个时候就可以考虑使用抽象工厂模式。比如你使用小米智能家居时,配套使用的使用小米智能音箱、小米智能台灯或小米家的其他产品。

4. 抽象工厂模式的优缺点

抽象工厂的优点

  1. 隔离了对象创建的细节,客户端无需知道对象创建过程
  2. 产品族的多个对象被约束在一起,客户端始终使用同一个产品族的产品。
  3. 增加产品族时,扩展方便,只需要增加实现产品等级具体对象,再增加实际生产工厂,无需改动原来的逻辑,符合开闭原则。

抽象工厂的缺点

  1. 扩展产品等级结构不方便,需要改动到原来的定义逻辑,不符合开闭原则。

❤️ 看完小事件

如果你觉得这篇内容对你有一点帮助或启发,想请你动动小指拇:

  1. 点赞,让更多的人也能看到这篇内容(收藏加点赞,永远不慌张(乛◡乛))。
  2. 关注公众号[ 撸透JAVA开发 ],不定期分享原创知识。
  3. 溜达溜达公众号,看看其他文章是否对你也有启发,或公众号留言。

本文使用 mdnice 排版