场景问题
举一个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常要选择一系列配件,比如CPU,硬盘,内存,主板等,这里我们只考虑CPU和主板问题
选择不同的CPU和主板,是每一个客户在组装电脑的时候,向装机公司提出的要求,也就是我们自己制定的装机方案,在确定这个方案之前,我们也需要考虑到个个配件之间的兼容性,但是对于装机工程师来说,它只知道组装一台电脑,需要相应的配件,但是具体使用什么还是客户决定的
不同模式下的解决方案
由此,对于装机公司来说,我们只知道CPU和主板的接口,而不知道具体的实现,很明显我们可以使用简单工厂或工厂方法模式,但是这里会产生一个问题,CPU和主板对象其实是有关系的,是需要相互匹配的,但是在简单工厂中间,并没有维护这一个关系,但是我们却可以用抽象工厂模式来解决这一个问题
什么是抽象工厂
提供一个创建一系列的相互依赖对象的接口,而无需指定他们具体的类
思路
只知道所需的一系列对象的接口,而不知道具体实现,或不知道具体使用哪一个实现,二是这一系列对象是相关或相互依赖的,也就是说要创建接口的对象还要约束他们之间的关系
示例代码
创建CPU接口类
public interface CPUApi {
/**
* CPU 具有运算功能
*/
void calculate();
}
主板接口类
/**
* @author 谭婧杰
* @data 2020/1/26
*/
public interface MainboardApi {
void installCPU();
}
他们实现类 分别是IntelCPU和 GAMainboard
/**
* @author 谭婧杰
* @data 2020/1/26
*/
public class IntelCPU implements CPUApi {
public int pins = 0;
public IntelCPU(int pins) {
calculate();
this.pins = pins;
}
@Override
public void calculate() {
System.out.println("因特网 cpu"+pins);
}
}
/**
* @author 谭婧杰
* @data 2020/1/26
*/
public class GAMainboard implements MainboardApi {
public GAMainboard(int cpuHoles) {
installCPU();
this.cpuHoles = cpuHoles;
}
private int cpuHoles = 0;
@Override
public void installCPU() {
System.out.println("GAMainboard ======="+cpuHoles);
}
}
定义抽象工厂
/**
* @author 谭婧杰
* @data 2020/1/26
*/
public interface AbstractFactory {
CPUApi createCPUApi();
MainboardApi createMainboarApi();
}
实现类
/**
* @author 谭婧杰
* @data 2020/1/26
*/
public class Schemal implements AbstractFactory {
@Override
public CPUApi createCPUApi() {
return new IntelCPU(110);
}
@Override
public MainboardApi createMainboarApi() {
return new GAMainboard(110);
}
}
装机工程师类
/** 装机工程师类
* @author 谭婧杰
* @data 2020/1/26
*/
public class ComputerEngineer {
private CPUApi cpu = null;
private MainboardApi mainboardApi = null;
public void makeComputer(AbstractFactory abstractFactory){
preparHardwares(abstractFactory);
}
public void preparHardwares(AbstractFactory abstractFactory){
abstractFactory.createCPUApi();
abstractFactory.createMainboarApi();
}
}
客户端调用
/**
* @author 谭婧杰
* @data 2020/1/26
*/
public class Client {
public static void main(String[] args) {
ComputerEngineer engineer = new ComputerEngineer();
AbstractFactory s = new Schemal();
engineer.makeComputer(s);
}
}
运行结果
模式详解
功能
为一系列相关的对象或相互依赖的对象创建一个接口,这个接口中的对象并不是任意堆积的,而是一系列相关的或者相互依赖的方法,(本质其实是选择产品簇的实现)
ps
AbstractFactory在java总通常实现为一个接口,具体的实现在实现类中,而不是实现为一个抽象类