大话设计模式——7.抽象工厂模式(Abstract Factory Pattern)

1.介绍

抽象工厂模式是工厂模式的进一步优化,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。属于创建型模式。
UML图:
在这里插入图片描述

2.示例

车辆制造工厂,不仅可以制造轿车也可以用来生产自行车。
1)AbstractFactory:VehicleFactory

public interface VehicleFactory {/*** 建造自行车** @return*/Bike createBike();/*** 建造轿车** @return*/Car createCar();
}

2)AbstractProductA:Bike

public interface Bike {void bikeName();
}

3)AbstractProductB:Car

public interface Car {void carName();
}

4)ConcreteFactoryA:BMWVehicleFactory

public class BMWVehicleFactory implements VehicleFactory {@Overridepublic Bike createBike() {return new BMWBike();}@Overridepublic Car createCar() {return new BMWCar();}
}

5)ConcreteFactoryB:TeslaVehicleFactory

public class TeslaVehicleFactory implements VehicleFactory {@Overridepublic Bike createBike() {return new TeslaBike();}@Overridepublic Car createCar() {return new TeslaCar();}
}

6)ConcreteProductA1:BMWCar

public class BMWCar implements Car{@Overridepublic void carName() {System.out.println("宝马 x5 四驱 燃油车");}
}

7)ConcreteProductA2:TeslaCar

public class TeslaCar implements Car {@Overridepublic void carName() {System.out.println("特斯拉 modelY 四驱 电动车");}
}

8)ConcreteProductB1:BMWBike

public class BMWBike implements Bike{@Overridepublic void bikeName() {System.out.println("宝马 碳纤维 大喇叭 二驱 自行车");}
}

9)ConcreteProductB2:TeslaCar

public class TeslaCar implements Car {@Overridepublic void carName() {System.out.println("特斯拉 modelY 四驱 电动车");}
}

10)运行:
结合建议工厂模式:工厂生产者,可以再进行优化,通过反射的机制动态构建

public class VehicleFactoryProducer {/*** 超级工厂** @param vehicleName* @return*/public static VehicleFactory creatVehicleFactory(String vehicleName) {if ("BMW".equals(vehicleName)) {return new BMWVehicleFactory();} else if ("Tesla".equals(vehicleName)) {return new TeslaVehicleFactory();}return null;}
}

运行类

public class Main {public static void main(String[] args) {System.out.println("------BMW制造工厂-----");VehicleFactory bmwFactory = VehicleFactoryProducer.creatVehicleFactory("BMW");bmwFactory.createBike().bikeName();bmwFactory.createCar().carName();System.out.println("\n------Tesla制造工厂-----");VehicleFactory teslaFactory = VehicleFactoryProducer.creatVehicleFactory("Tesla");teslaFactory.createCar().carName();teslaFactory.createBike().bikeName();}
}

在这里插入图片描述

3.总结

1)优点:
a. 让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂实现分离,不会出现在客户代码中
b. 可以保证使用方始终只使用同一个产品族中的对象
c. 扩展容易,只需要增加新的产品类和对应的工厂类即可

2)缺点:
a. 不符合开闭原则,新增产品类时需要修改抽象工厂和抽象产品中的代码
b. 增加了系统的复杂性和抽象性

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法——异或运算

理解: 1、相同为0,不同为1 2、可以理解为2进制的无进位相加 性质: 1、0 ^ N N N ^ N 0 2、交换律 结合律 a ^ b b ^ a a ^ b ^ c a ^ ( b ^ c ) 用异或实现两个数交换 #include"iostream" using namespace std; int ma…

vivado 逻辑优化约束、功率优化、Vivado Tools电源优化

逻辑优化约束 逻辑保护 Vivado设计套件在逻辑优化过程中尊重DONT_TOUCH属性。确实如此不优化具有这些特性的离开网或单元。为了加快网络选择过程,网络具有DONT_TOUCH的属性被预过滤并且不被考虑用于物理优化。对于有关详细信息,请参阅《Vivado Design …

10、MongoDB -- MongoDB 的 MongoTemplate 的功能和用法介绍

目录 MongoTemplate 的功能和用法演示前提:登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 为 MongoDB 提供的两个 Starterspring-boot-starter-data-mongodb(为以同步方式操作 Mo…

C语言:操作符详解(下)

目录 一、逗号表达式二、下标访问[ ]、函数调用()1. [ ]下标引用操作符2.函数调用操作符 三、结构成员访问操作符1.结构体(1) 结构的声明(2) 结构体变量的定义和初始化 2.结构成员访问操作符(1)结构体成员的直接访问(2)结构体成员的间接访问 四、操作符的属性:优先级…

<个人笔记>数论

1.快速幂 (1)求解问题: 给定 n组 ai,bi,pi求 aibi mod pi 的值。 (2)主要思想:任何一个数(b),可以被 n 个 2k 相加获得。 即 b 2k1 2k2 2k3 … 2logb。 快速幂模板: typedef long long LL;LL qmi(int a,int b,int p){LL re…

深入理解JMM

一、什么是JMM JMM(java memory model)Java内存模型:是java虚拟机规范中定义的一组规范,用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让JAVA程序在各平台都能达到一致的并发结果。其主要规定了线程和内存之间的…

对称加密算法(DES、AES)

加密密钥 解密密钥 DES现在基本不再使用 3DES处理速度慢 AES通常用于移动通信系统加密以及基于SSH协议的软件

c++入门你需要知道的知识点(上)

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 今日主菜:c入门 主厨:邪王真眼 所属专栏:c专栏 主厨的主页:Chef‘s blog 前言: 咱也是好久没有更…

Leet code 1658 将x减到0的最小操作数

解题思路:滑动窗口 主要思想:正难逆简 题目需要左找一个数 右找一个数 我们不如直接找中间最长的一连串子数让这串子树和为 数组子树和减去X 找不到就返回 -1 滑动窗口双指针从左端出发,进行 进窗口 判断 出窗口 更新结果四个步骤 代码…

python文件的打开及open方法

打开文件 方法1: 使用try/except/finally 例子: try:data_in open(rD:\TEST\a.txt,encodingutf-8)print(data_in.readlines(),end)except IOError:print(File Error occured!)finally:data_in.close() 结果: [这是一个测试文件。\n, 文…

C++ Qt里如何使用std::thread

本篇博客介绍如何在C++ Qt项目里使用std::thread,以及父子线程之间的交互方法。 怎么编写多线程代码 很多C++开发者困惑如何使用多线程,其实主要是在做项目时是否有多任务的场景,如果没有则不需要使用到多线程,用一个客户端开发的场景来解释一下如何使用多线程,例如开发一…

防火墙中的SNAT 与DNAT

SNAT:让内网机器可以访问外网服务器 DNAT:让外网机器可以访问内网服务器 SNAT的原理 源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映射 数据包从内网发送到公网时,SNAT会把数据包的源IP由私网IP转换成公网IP 当响应…

JAVA 100道题目(2)

2.创建一个程序,接受用户输入的字符串并检查它是否为回文。 以下是一个简单的Java程序,它接受用户输入的字符串并检查该字符串是否为回文(正读和反读都相同的字符串): java复制代码 import java.util.Scanner; public…

with open----bug

with open(os.path.join(output_path, "closed_rel_paths.jsonl"), "w") as f: # 打开文件,准备写入闭合关系路径for head in tqdm(rdict.rel2idx): # 遍历头部关系paths set() # 初始化路径集合if head "None" or "inv_&q…

【JetsonNano】onnxruntime-gpu 环境编译和安装,支持 Python 和 C++ 开发

1. 设备 2. 环境 sudo apt-get install protobuf-compiler libprotoc-devexport PATH/usr/local/cuda/bin:${PATH} export CUDA_PATH/usr/local/cuda export cuDNN_PATH/usr/lib/aarch64-linux-gnu export CMAKE_ARGS"-DONNX_CUSTOM_PROTOC_EXECUTABLE/usr/bin/protoc&qu…

在Java中如何将十进制转换为二进制,八进制,十六进制以及它们之间的互相转换

目录 一、算法实现进制之间的转换 (1)十进制转换为二进制 (2)二进制转换成十进制 二、Java中的API实现进制转换 (1)十进制转换为二进制 (2)十进制转换为八进制 (3…

OJ_点菜问题(背包问题)

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;int main() {int c, n;scanf("%d%d", &c, &n);int p[101];int v[101];for (int i 0; i < n; i){scanf("%d%d", &p[i],…

Android Studio实现内容丰富的安卓宠物用品管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.系统公告 3.宠物社区&#xff08;可发布宠物帖子&#xf…

47、C++/引用,函数重载,类相关学习20240312

一、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show()。 代码&…

oppo前端开发一面

提问&#xff1a; 1. 谈谈你怎么实现响应式布局 2. 谈谈你对weback的了解&#xff0c;vite和webpack的区别&#xff0c;webpack loader 3. 你项目怎么用CI/CD&#xff08;不懂&#xff0c;只知道自动化部署了&#x1f62d;&#xff09; 4. ts中type和interface区别 5. axi…