博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA 设计模式之抽象工厂模式
阅读量:3923 次
发布时间:2019-05-23

本文共 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/

你可能感兴趣的文章
通过 .NET NativeAOT 实现用户体验升级
查看>>
如何友好的处理 WebApi 中抛出的错误
查看>>
因MemoryCache闹了个笑话
查看>>
Dotnet的垃圾回收
查看>>
乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时
查看>>
gRPC在C#中的未来属于grpc-dotnet
查看>>
快速排序的性能和名字一样优秀
查看>>
开源推荐:Asp.Net Core入门学习手册!
查看>>
ML.NET 示例:对象检测
查看>>
C#基于yolov3的行人检测
查看>>
ML.NET Cookbook:(16)什么是规范化?为什么我需要关心?
查看>>
WPF 修改(优化)Menu菜单的样式
查看>>
我开发了一款基于web容器的前端项目容器
查看>>
WPF实现环(圆)形菜单
查看>>
WPF 写一个提醒工具软件(完整项目)
查看>>
Windows 11 快速体验:开始菜单居中,全系圆角设计!
查看>>
异步流使用注意事项
查看>>
NET问答: 为什么仅有 getter 的属性,还可以在构造函数中赋值 ?
查看>>
WPF TextBox限制只能输入数字的两种方法
查看>>
【荐】牛逼的WPF动画库:XamlFlair
查看>>