本文共 2539 字,大约阅读时间需要 8 分钟。
举一个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常要选择一系列配件,比如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总通常实现为一个接口,具体的实现在实现类中,而不是实现为一个抽象类转载地址:http://ojkgn.baihongyu.com/