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. 抽象工厂模式的优缺点
抽象工厂的优点
- 隔离了对象创建的细节,客户端无需知道对象创建过程
- 产品族的多个对象被约束在一起,客户端始终使用同一个产品族的产品。
- 增加产品族时,扩展方便,只需要增加实现产品等级具体对象,再增加实际生产工厂,无需改动原来的逻辑,符合开闭原则。
抽象工厂的缺点
- 扩展产品等级结构不方便,需要改动到原来的定义逻辑,不符合开闭原则。
❤️ 看完小事件
如果你觉得这篇内容对你有一点帮助或启发,想请你动动小指拇:
- 点赞,让更多的人也能看到这篇内容(收藏加点赞,永远不慌张(乛◡乛))。
- 关注公众号[ 撸透JAVA开发 ],不定期分享原创知识。
- 溜达溜达公众号,看看其他文章是否对你也有启发,或公众号留言。
本文使用 mdnice 排版