设计模式之抽象工厂模式精讲

概念:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类。

抽象工厂模式是工厂方法模式的升级版本。在存在多个业务品种或分类时,抽象工厂模式是一种更好的解决方式。

抽象工厂模式的UML类图如下:
在这里插入图片描述

可以看出来,和工厂方法模式最大的区别就是支持了更多的产品线。还是通过一个例子来帮助大家理解这个过程。假设一辆车的生产过程只有车架、引擎和轮胎这三个步骤。我们创建这三个接口,对应UML图中的ProductA和ProductB,当然这里是三种产品,也可以更多。然后生产奔驰和宝马两个产品线,即创建6个类,奔驰车的车架、引擎和轮胎,宝马车的车架、引擎和轮胎,分别继承自车架、引擎和轮胎接口。然后在工厂类这边,我们创建一个带有3个方法的接口,分别是创建车架、创建引擎、创建轮胎。这样一来,我们的两个实现类(奔驰生产工厂和宝马生产工厂)就可以分别有一条生产汽车的流水线了。然后我们看代码。

public interface CarFrame {
    void getCarFrame();
}

public class BmwCarFrame implements CarFrame {
    @Override
    public void getCarFrame() {
        System.out.println("宝马车架完工");
    }
}

public class BenzCarFrame implements CarFrame {
    @Override
    public void getCarFrame() {
        System.out.println("奔驰车架完工");
    }
}

public interface Engine {
    void getEngine();
}

public class BmwEngine implements Engine {
    @Override
    public void getEngine() {
        System.out.println("宝马引擎完工");
    }
}

public class BenzEngine implements Engine {
    @Override
    public void getEngine() {
        System.out.println("奔驰引擎完工");
    }
}

public interface Tire {
    void getTire();
}

public class BmwTire implements Tire {
    @Override
    public void getTire() {
        System.out.println("宝马轮胎完工");
    }
}

public class BenzTire implements Tire {
    @Override
    public void getTire() {
        System.out.println("奔驰轮胎完工");
    }
}

public interface CarFactory {
    CarFrame createCarFrame();
    Engine createEngine();
    Tire createTire();
}

public class BmwFactory implements CarFactory {
    @Override
    public CarFrame createCarFrame() {
        return new BmwCarFrame();
    }
    @Override
    public Engine createEngine() {
        return new BmwEngine();
    }
    @Override
    public Tire createTire() {
        return new BmwTire();
    }
}

public class BenzFactory implements CarFactory {
    @Override
    public CarFrame createCarFrame() {
        return new BenzCarFrame();
    }
    @Override
    public Engine createEngine() {
        return new BenzEngine();
    }
    @Override
    public Tire createTire() {
        return new BenzTire();
    }
}

public class Demo {
    public static void main(String[] args) {
        BmwFactory bmwFactory = new BmwFactory();
        CarFrame bmwFrame = bmwFactory.createCarFrame();
        bmwFrame.getCarFrame();
        Engine bmwEngine = bmwFactory.createEngine();
        bmwEngine.getEngine();
        Tire bmwTire = bmwFactory.createTire();
        bmwTire.getTire();
        System.out.println("宝马车生产完成");
        System.out.println("****************分割线*******************");
        BenzFactory benzFactory = new BenzFactory();
        CarFrame benzFrame = benzFactory.createCarFrame();
        benzFrame.getCarFrame();
        Engine benzEngine = benzFactory.createEngine();
        benzEngine.getEngine();
        Tire benzTire = benzFactory.createTire();
        benzTire.getTire();
        System.out.println("奔驰车生产完成");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/491998.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于XGBoost和数据预处理的电动汽车车型预测

基于XGBoost和数据预处理的电动汽车车型预测 文章目录 基于XGBoost和数据预处理的电动汽车车型预测1、前言2、导入数据3、各县电动汽车采用情况条形图4、电动车类型饼图5、前5最欢迎的电动车制造商6、XGBoost模型6.1 字符串列的标识6.2 删除不相关的列6.3 编码分类变量6.4 电动…

大数据分析案例-基于决策树算法构建大学毕业生薪资预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

渐变色x轴换行柱状图

// 系统上云率const optionBar {title: {text: 系统上云率,left: left,textStyle: {color: "#fff",fontSize: 14,fontWeight: 650,align: "center",},},color: [#32C5FF, #00F766, #EECB5F],grid: {top: 40,bottom: 0,},legend: { // 控制图例组件show: …

C语言中其他运算符介绍

除了算术运算符和位运算符外,C语言还提供了一些其他类型的运算符,包括逗号运算符、条件运算符、sizeof运算符、指针运算符等。这些运算符在C语言中具有特定的功能和用途,对于编写复杂的程序和实现各种算法非常有用。本文将深入介绍C语言中的这…

是德科技keysight DSOX3104A示波器

181/2461/8938产品概述: Keysight(原Agilent) InfiniiVision DSOX3104A 的价位较低,能够在满足您苛刻预算要求的情况下提供卓越性能,以及可选功能。是德(原安捷伦)突破性技术可以在相同的预算条件下提供更多更出色的示波器功能 Keysight(原A…

Spring Boot 整合分布式搜索引擎 Elastic Search 实现 自动补全功能

文章目录 ⛄引言一、分词器⛅拼音分词器⚡自定义分词器 二、自动补全查询三、自动补全⌚业务需求⏰实现酒店搜索自动补全 四、效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,…

zabbix监控vmware esxi

一、zabbix服务端配置 修改zabbix_server.conf配置文件 vim /etc/zabbix/zabbix_server.conf #######zabbix_server.conf底部第二行开始添加下面配置######## StartVMwareCollectors5 #StartVMwareCollectors - 预先启动Vmware collector收集器实例的数量。此值取决于要监控的…

深入了解 Postman 请求头的使用方法

当你在使用 Postman 发送请求时,请求头(Headers)是你可以包含在 HTTP 请求中的重要部分之一。请求头包含了关于请求的元数据信息,这些信息对于服务器来处理请求是非常重要的。下面是一份详细的图文介绍,说明了如何在 P…

算法(6)KMP+trie

KMP: 最浅显易懂的 KMP 算法讲解_哔哩哔哩_bilibili 该视频使用python书写代码,不会python的小伙伴也可以看看了解kmp的大致思路。 问题描述: kmp:字符串匹配算法,用来找一个长字符串中出现了几次小字符串&#xf…

ubuntu中使用docker对配置文件进行挂载

目录 1.什么是挂载? 2.挂载的好处 3.挂载的方法 4.运行 5.查看 1.什么是挂载? 挂载通常指的是使操作系统能够访问到文件系统的过程。当一个文件系统被挂载到一个目录(称为挂载点)后,从该目录及其子目录下就可以访…

游戏本续航@控制中心的省电模式效果如何

文章目录 节能模式长续航模式👺相关工具 节能模式长续航模式👺 蓝天模具Control Center中的模式 根据我的试验,以及软件的提示,可以发现 Power Saving是最省电的,儿Quiet模式并不省电,它会启用独立显卡,只不过风扇的转速不像娱乐模式和性能模式那么积极而…

MySQL中使用distinct单、多字段去重方法

目录 一、distinct 1.1 只对一个字段查重 1.2多个字段去重 1.3针对null处理 1.4与distinctrow同义 二、聚合函数中使用distinct 三、CONCAT_WS函数 多个字段拼接去重是指将多个字段的值按照一定的规则进行拼接,并去除重复的拼接结果。这样可以生成唯一标识符…

抖店找达人带货,能赚钱吗?了解达人的这些特征!出单其实很简单

哈喽~我是电商月月 把抖音小店做起来的人都说,抖音小店前期出单最好的方式只有达人带货 那为什么还有那么多新手朋友确实找达人带货了,仍是不赚钱,不出单呢? 原因只有两点: 要么是你的品不好,要么就是你…

YOLOv7 | 注意力机制 | 添加ECA注意力机制

目录 原理简介 代码实现 yaml文件实现(tips:可以添加不同的位置) 检查是否添加执行成功 完整代码分享 论文创新必备(可帮忙做实验) 启动命令 ECA是通道注意力机制的一种实现形式,是基于SE的扩展。…

基于工业以太网的电能计量管理系统的应用

摘要:针对目前工业电能模式的研究现状,本文阐述了在现代以太网基础上的电能管理系统的设计。 该系统实现了电能的远程实时监控与管理,并且该系统支持多种终端设备的远程访问,建立了一个实时的人机界面管理平台,实现对电…

Web CSS笔记2

目录 1、背景 ①、背景图片(image) ②、背景平铺(repeat) ③、背景位置(position) ④、背景附着(attachment) ⑤、背景透明(CSS3) ⑥、背景图片缩放大小(size): ⑦、背景简写 2、标签显…

全国1000米分辨率逐年植被覆盖度(FVC)数据集

本数据集包括2000年至今,全国逐年植被覆盖度数据,FVC范围值为0-1,数据为浮点型,GeoTIFF格式。GeoTIFF文件均可用ArcGIS软件和GDAL读取和打开。 植被覆盖度是指植被(包括叶、茎、枝)在地面的垂直投影面…

【CXL协议-事务层之CXL.cache (3)】

3.2 CXL.cache 3.2.1 概述 CXL.cache 协议将设备和主机之间的交互定义为许多请求,每个请求至少有一个关联的响应消息,有时还有数据传输。 该接口由每个方向的三个通道组成: 请求、响应和数据。 这些通道根据其方向命名,D2H&…

Llama模型下载

最近llama模型下载的方式又又变了,所以今天简单更新一篇文章,关于下载的,首先上官网,不管在哪里下载你都要去官网登记一下信息:https://llama.meta.com/llama2 然后会出现下面的信息登记网页: 我这里因为待…

【unity】认识unity Hub的主要功能

这里我们主要讲解unity Hub中的【项目】和【安装】功能,其他对应的功能栏相信大家根据文字就可以知道相应的作用。 首先是介绍【项目】功能,在这里我们可以创建本地项目和云端项目,作为初学者我们创建本地项目皆可,当然如果你是多…