JAVA 设计模式之抽象工厂模式

场景问题

举一个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常要选择一系列配件,比如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总通常实现为一个接口,具体的实现在实现类中,而不是实现为一个抽象类

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值