前言
抽象工厂模式虽然名字中带有工厂模式,但与真正的工厂模式还是有本质区别的。抽象工厂可以理解为是一个超级工厂,生产工厂的工厂。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
定义
提供生产一组具有相关性或者依赖性对象的接口,调用者不需要指定对象具体实现类,就可以得到同族的不同产品。
优点
- 将具有相关性的产品放在同一工厂加工,减少类的数量。
- 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
- 抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码。
缺点
- 当同一种族需要添加新产品时,显得不灵活,需要修改源码。
- 增加了系统的抽象性和理解难度。
图解
实现
抽象产品接口
//抽象产品:提供产品生产细节
public interface IphoneInterface {
void print();
}
电池类
//具体产品:电池
public class Battery implements IphoneInterface {
@Override
public void print() {
System.out.println("电池生产完成");
}
}
屏幕类
//具体产品:屏幕
public class Screen implements IphoneInterface {
@Override
public void print() {
System.out.println("显示屏生产完成");
}
}
抽象工厂
//抽象工厂:提供了手机各个配件生产方法
public interface IphoneAbstractFactory {
public IphoneInterface newBattery();
public IphoneInterface newScreen();
}
具体实现工厂
public class IphoneAbstractFactoryImpl implements IphoneAbstractFactory {
@Override
public IphoneInterface newBattery() {
System.out.println("电池配件工厂开工-->生产电池");
return new Battery();
}
@Override
public IphoneInterface newScreen() {
System.out.println("显示屏工厂开工-->生产显示屏");
return new Screen();
}
}
测试
public class Test {
public static void main(String[] args) {
IphoneAbstractFactory iphoneAbstractFactory = new IphoneAbstractFactoryImpl();
iphoneAbstractFactory.newBattery().print();
iphoneAbstractFactory.newScreen().print();
}
}
打印输出
电池配件工厂开工-->生产电池
电池生产完成
显示屏工厂开工-->生产显示屏
显示屏生产完成
解释
总结
当我们有需求将一系列的产品族统一到一起创建的时候可以使用抽象工厂模式。抽象工厂模式可以理解为工厂的工厂,是一个生产工厂的超级工厂