工厂方法入门


#include <iostream>// 定义抽象交通工具的基类
// 产品的接口
class Transport {
public:virtual~Transport() {}; // 虚的析构函数virtual void deliver() const = 0; // 纯虚函数
};// 定义卡车交通工具,继承交通工具
// 产品 A 
class Truck :public Transport {
public:void deliver() const override            // 继承过来的{std::cout << "卡车运输 ..." << std::endl;}};// 定义轮船交通工具,继承交通工具
// 产品 B
class Ship :public Transport {
public:void deliver() const override{std::cout << "轮船运输 ..." << std::endl;}
};// 物流公司
// 创造者
class Logistics
{
public:virtual ~Logistics() {};   // 虚的析构函数// 工厂方法的核心virtual Transport* factoryMethold() const = 0;  // 物流公司创建工厂方法,基类void doSomething(){Transport* transport = factoryMethold();transport->deliver();delete transport;       // 释放指针}
};// 卡车继承物流公司的工程方法,new Truck
// 具体的创造者 A
class TruckLogistics : public Logistics 
{
public:virtual ~TruckLogistics() {};   // 虚的析构函数Transport* factoryMethold() const override{return new Truck();}
};// 轮船继承物流公司的工程方法,new Ship
// 具体的创造者 B
class ShipLogistics : public Logistics
{
public:virtual ~ShipLogistics() {};   // 虚的析构函数Transport* factoryMethold() const override{return new Ship();}};// 实现创建这就和产品松耦合
int main()
{Logistics* truckLogistics = new TruckLogistics();truckLogistics->doSomething();delete truckLogistics;Logistics* shipLogistics = new ShipLogistics();shipLogistics->doSomething();delete shipLogistics;return 0;
}
  • 对扩展开放,对修改关闭
  • 依赖倒置,避免依赖具体的类,尽量依赖抽象。可以尽量避免抽象。可以避免创建者和具体产品之间的紧密耦合。
  • 单一职责原则,将产品创建代码放在程序的单一位置,从而使得代码更易维护。

**缺点:**应用工厂方式模式需要引入许多新的子类,代码可能会因此编的更加复杂。最好的情况是将该模式引入创建者的现有层次结构中。

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

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

相关文章

mysql8.0-cnf文件

一、my.cnf 文件 注意&#xff1a;根据自己环境进行参数的调整。 [client] port 3307 socket /data/mysql8.0.35/3307/tmp/mysql.sock[mysqldump] quick max_allowed_packet 64M[mysql] prompt"\u\h: \R:\m:\s [\d]> " no-auto-rehash[mysqld] ###### BASIC…

移动机器人激光SLAM导航(文章链接汇总)

移动机器人激光SLAM导航&#xff08;一&#xff09;&#xff1a;理论基础篇 移动机器人激光SLAM导航&#xff08;二&#xff09;&#xff1a;运动控制与传感器篇 移动机器人激光SLAM导航&#xff08;三&#xff09;&#xff1a;Hector & GMapping SLAM 篇 持续更新中…

JVM性能分析工具——Arthas及火焰图的使用

Arthas的使用 Arthas常用命令Arthas的安装Linux压测工具Apache Bench安装火焰图的使用火焰图如何分析火焰图的互动 Arthas常用命令 help &#xff1a;查看所有命令dashboard &#xff1a;仪表板&#xff0c;查看线程的CPU信息等heapdump &#xff1a;不同类对象占用内存比重&a…

Springboot 校验工具类

校验工具类 这个实现逻辑很简单,就是调用string的正则表达式 我这里的代码要导入糊涂工具包 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.17</version> </dependency>import…

MySQL数据库基础第三篇(约束)

文章目录 一、约束概述二、约束演示1.演示代码2.读出结果 三、外键约束1.创建外键2.删除更新外键 作为软件工程师和数据库管理员&#xff0c;我们经常需要操作和管理数据库。对于数据库中的信息完整性和准确性的确保&#xff0c;以及对数据质量的提升&#xff0c;数据库中的约束…

2023年09月CCF-GESP编程能力等级认证Python编程二级真题解析

一、单选题(共15题,共30分) 第1题 我国第一台大型通用电子计算机使用的逻辑部件是 ( )。 A:集成电路 B:大规模集成电路 C:晶体管 D:电子管 答案:D 第2题 下列流程图的输出结果是( )? A:5 12 B:12 5 C:5 5 D:12 12 答案:B 第3题 如果要找出整数 a …

2024/1/31 备战蓝桥杯 3-2 栈

目录 后缀表达式 P1449 后缀表达式 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 栈 P1044 [NOIP2003 普及组] 栈 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 后缀表达式 P1449 后缀表达式 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;模拟stl的…

【分布式技术专题】Guava RateLimiter 针对于限流器的入门到实战(含源码分析介绍)

Guava RateLimiter 针对于限流器的入门到实战 限流器的思路和算法漏桶算法令牌算法 RateLimiter限流器RateLimiter的作用create方法acquire方法tryAcquire方法 详细分析参数抛出异常参数抛出异常实践案例第1次获取10个令牌第2次获取1个令牌第3次获取10个令牌 资料参考 限流器的…

maven: 使用profiles进行多环境配置

文章目录 一、背景二、如何配置 一、背景 在项目开发的过程中会用到多个环境比如&#xff1a;本地环境&#xff08;开发自测&#xff09;、开发环境&#xff08;环境部署自测&#xff09;、生产环境等&#xff0c;由于不同的环境需要不同的配置信息&#xff0c;为了便于开发使…

python-自动化篇-运维-监控-简单实例-道出如何使⽤Python⾃动化数据库备份?

使⽤Python⾃动化数据库备份是⼀种有效的⽅式&#xff0c;可以确保数据库数据的安全性和可恢复性。 以下是⼀般步骤&#xff0c;说明如何使⽤Python⾃动化数据库备份&#xff1a; 选择数据库备份⼯具&#xff1a;⾸先&#xff0c;选择适合数据库类型的备份⼯具。不同的数据库系…

opencv——将2张图片合并

效果演示: 带有绿幕的图片的狮子提取出来,放到另一种风景图片里! 1. 首先我们要先口出绿色绿幕,比如: 这里将绿色绿色绿幕先转为HSV,通过修改颜色的明暗度,抠出狮子的轮廓。 代码 : import cv2 as cv import numpy as np import matplotlib.pyplot as plt def showI…

C++模板判断类中是否存在某个名称的成员函数

由一道C面试题引发的思考 - 知乎 //判断是否存在指定的成员函数名 template <typename T, typename void> struct HasMemF_Fun : public std::false_type {};template <typename T> struct HasMemF_Fun<T, std::void_t<decltype(&T::Fun123)>>: s…

Unity MonoBehaviour 单例和标准单例的区别

共同特点 单一实例&#xff1a;无论是 MonoBehaviour 单例还是标准单例模式&#xff0c;它们都保证类只有一个实例存在。 全局访问点&#xff1a;两种单例模式都提供一个全局访问点&#xff0c;允许从应用程序的任何地方访问单例实例。这通常是通过一个公共的静态方法或属性实…

spring-boot-admin的介绍和使用

概述 Spring Boot 有一个非常好用的监控和管理的源软件&#xff0c;这个软件就是 Spring Boot Admin。该软件能够将 Actuator 中的信息进行界面化的展示&#xff0c;也可以监控所有 Spring Boot 应用的健康状况&#xff0c;提供实时警报功能。 主要的功能点有&#xff1a; 显…

tcpdump 抓包无法落盘

文章目录 问题背景解决办法 问题背景 在嵌入式设备中(Linux系统)&#xff0c;为了分析两个网络节点的通讯问题&#xff0c;往往需要用到tcpdump&#xff0c;抓一个.pcap的包在PC端进行分析。博主在实际操作中发现&#xff0c;抓包无法实时落盘。 解决办法 # 下面的命令是写在…

面试八股文(2)

文章目录 1.ArrayList和LinkedList区别2.HashMap和HashTable区别3.线程的创建方式4.Java中异常处理5.Java序列化中某些字段不想进行序列化&#xff1f;6.Java序列化7.静态方法和实例方法8.List、Set、Map三者区别9.ArrayList和Vector区别10.HashMap和HashSet区别 1.ArrayList和…

还在用findViewById,不来了解下其它方式?

众所周知&#xff0c;都2225年了&#xff0c;如果你还在用Java敲安卓代码&#xff0c;findViewById已经是一种非常繁琐的操作&#xff0c;如果要去获取的id数量多&#xff0c;则对开发更加不友好。如果一个页面id过多&#xff0c;经常会有如下场景&#xff1a; TextView title…

ISOLAR-A/B问题总结

ISOLAR-A/B报错问题一&#xff1a; 1. Target ARObject: <ECUC-MODULE-CONFIGURATION-VALUES-REF> Unable to resolve reference /ETAS_Project/EcucModuleConfigurationValuess/E2E. - Line: 99. [Infos] <ECUC-MODULE-CONFIGURATION-VALUES-REF> : </ARPacka…

Pytest 与allure测试报告集成

通过Feature, story, step 记录测试的功能&#xff0c;场景及测试步骤 # login.pylogin_func函数 传入参数是name 和 password 当输入的name和password与数据库db_data中数据一致时&#xff0c;返回“XXX成功登录系统&#xff01;” 当输入的name存在于数据库db_data但密码不正…

Qt应用开发(安卓篇)——调用ioctl、socket等C函数

一、前言 在 Qt for Android 中没办法像在嵌入式linux中一样直接使用 ioctl 等底层函数&#xff0c;这是因为因为 Android 平台的安全性和权限限制。 在 Android 中&#xff0c;访问设备硬件和系统资源需要特定的权限&#xff0c;并且需要通过 Android 系统提供的 API 来进行。…