抽象工厂模式
3.1. 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
3.2. 抽象工厂类图如下:
从上图可以看出,抽象工厂方法允许有一个最顶层的工厂接口或者抽象工厂类,该类下可以有多个不同的工厂,如factory1,factory2等等。工厂1和2都能生产一系列的产品A和B,但是工厂1和工厂2生产的A和B都是相互独立的。举个例子,以手机为例,productA表示手机的处理器,A1表示安卓的骁龙系列处理器,A2表示苹果的A系列处理器(eg:A12…);productB表示数据线,B1表示安卓的Type-c数据线,B2表示苹果的lighting数据线.在这种前提下,安卓和苹果的相关数据线和处理器是无法混用的,如果使用苹果的处理器,我们就只能使用苹果的数据线。(例子可能有些不恰当,勉强看看-)。
3.3. 按照以上场景代码实例如下:
产品的抽象类:
cpu:
public interface Cpu {
void cup();
}
数据线:
public interface DataWire {
void dataWire();
}
具体产品类:
安卓类cpu和数据线:
public class AndroidCpu implements Cpu {
@Override
public void cup() {
System.out.println("-----------Android Cpu--------");
}
}
public class AndroidDataWire implements DataWire {
@Override
public void dataWire() {
System.out.println(">>>>>>>>>安卓数据线<<<<<<<<<<<<<<<");
}
}
苹果类Cpu和数据线:
public class AppleCpu implements Cpu {
@Override
public void cup() {
System.out.println("---------------Apple Cpu------------");
}
}
public class AppleDataWire implements DataWire{
@Override
public void dataWire() {
System.out.println(">>>>>>>>>>苹果数据线<<<<<<<<<");
}
}
抽象工厂类:
public interface AbsFactory {
DataWire productDataWire();
Cpu productCpu();
}
具体工厂类:
安卓工厂:
public class AndroidFactory implements AbsFactory {
@Override
public DataWire productDataWire() {
return new AndroidDataWire();
}
@Override
public Cpu productCpu() {
return new AndroidCpu();
}
}
苹果工厂:
public class AppleFactory implements AbsFactory {
@Override
public DataWire productDataWire() {
return new AppleDataWire();
}
@Override
public Cpu productCpu() {
return new AppleCpu();
}
}
测试主函数:
public class Main {
public static void main(String[] args) {
AbsFactory factory = null;
factory = new AndroidFactory();
factory.productCpu().cup();
factory.productDataWire().dataWire();
System.out.println("=========================================");
factory = new AppleFactory();
factory.productCpu().cup();
factory.productDataWire().dataWire();
}
}
一般使用抽象工厂的情况:
- 同属于一个产品族的产品是一起使用的,如果上面的苹果需要使用苹果手机相关配件,安卓需要使用安卓手机相关配件。
- 系统有多个产品族,但是系统每次只调用一个产品族也就是一类了。
抽象工厂的优点:
将接口和具体实现分离,实现了一定的解耦合,客户端值需要使用抽象工厂来创建,但是不需要具体指导是哪个对象。
从一类产品切换到另一类产品变得简单。
当然抽象工厂模式的缺点也是很明显的,如果要给整个生产线或产品族添加一个新的产品,以上面的例子,比如手新增了一个耳机,我们知道苹果的耳机接口是lighting的和安卓的type-c又不相同。那么就需要修改抽象工厂,也就会对下面所有的工厂实现类产生影响,不利于维护。