Factory-Method

Factory-Method

动机
  • 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
  • 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
模式定义
  • 定义一个用于创建对象的接口(纯虚基类),让子类决定实例化哪一个类。 Factory使得一个类的实例化延迟(目的:解耦, 手段:虚函数)到子类。
  • 注:自定义1个纯虚工厂基类,其中有个虚方法,它返回我们想要的具体对象,具体实现由具体的工厂子类(工厂子类继承纯虚工厂父类)实现。

在这里插入图片描述

#include <iostream>
#include <string>class Product
{
public:virtual ~Product() {}virtual std::string getName() = 0;// ...
};class ConcreteProductA : public Product
{
public:~ConcreteProductA() {}std::string getName(){return "type A";}// ...
};class ConcreteProductB : public Product
{
public:~ConcreteProductB() {}std::string getName(){return "type B";}// ...
};class Creator
{
public:virtual ~Creator() {}virtual Product *createProductA() = 0;virtual Product *createProductB() = 0;virtual void removeProduct(Product *product) = 0;// ...
};class ConcreteCreator : public Creator
{
public:~ConcreteCreator() {}Product *createProductA(){return new ConcreteProductA();}Product *createProductB(){return new ConcreteProductB();}void removeProduct(Product *product){delete product;}// ...
};int main()
{Creator *creator = new ConcreteCreator();Product *p1 = creator->createProductA();std::cout << "Product: " << p1->getName() << std::endl;creator->removeProduct(p1);Product *p2 = creator->createProductB();std::cout << "Product: " << p2->getName() << std::endl;creator->removeProduct(p2);delete creator;return 0;
}
/*
Product: type A
Product: type B
*/
何时使用
  • 类无法预测它必须创建的对象的类
  • 一个类希望它的子类来指定它创建的对象
总结
  • Factory模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
  • Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
  • Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

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

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

相关文章

智能优化算法常用指标一键导出为EXCEL,CEC2017函数集最优值,平均值,标准差,最差值,中位数,秩和检验,箱线图...

声明&#xff1a;对于作者的原创代码&#xff0c;禁止转售倒卖&#xff0c;违者必究&#xff01; 之前出了一篇关于CEC2005函数集的智能算法指标一键统计&#xff0c;然而后台有很多小伙伴在询问其他函数集该怎么调用。今天采用CEC2017函数集为例&#xff0c;进行展示。 为了突…

根据前序遍历结果构造二叉搜索树

根据前序遍历结果构造二叉搜索树-力扣 1008 题 题目说明&#xff1a; 1.preorder 长度>1 2.preorder 没有重复值 直接插入 解题思路&#xff1a; 数组索引[0]的位置为根节点&#xff0c;与根节点开始比较&#xff0c;比根节点小的就往左边插&#xff0c;比根节点大的就往右…

力扣 354. 俄罗斯套娃信封问题(动态规划问题)

354. 俄罗斯套娃信封问题 - 力扣&#xff08;LeetCode&#xff09; 给你一个二维整数数组 envelopes &#xff0c;其中 envelopes[i] [wi, hi] &#xff0c;表示第 i 个信封的宽度和高度。 当另一个信封的宽度和高度都比这个信封大的时候&#xff0c;这个信封就可以放进另一…

Linux系统运行级别详解,切换、配置和常见服务

文章目录 Linux系统运行级别1. 介绍什么是系统运行级别系统运行级别的作用 2. Linux系统运行级别Linux系统预定义的运行级别每个运行级别的作用和特点 3. 切换系统运行级别如何查看当前系统运行级别如何切换到其他运行级别切换运行级别时需要注意的事项 4. 运行级别相关的服务和…

TCP/IP(十一)TCP的连接管理(八)socket网络编程

一 socket网络编程 socket 基本操作函数 bind、listen、connect、accept、recv、send、select、close 说明: 本文需要C语言、syscall系统调用、OS 操作系统支持,如果不了解可以暂时跳过备注&#xff1a; 知道对应库函数的更底层机制思考&#xff1a; socket函数与FIN、ACK等…

c++ 学习之 强制类型转换运算符 const_cast

看例子怎么用 int main() {int a 1;int* p a;// 会发生报错// 如果学着 c的风格类型转换int* pp (int*)a;*pp 1; // 编译不报错&#xff0c;但是运行报错// const_castconst int n 5;const std::string s "lalal";// const cast 只针对指针&#xff0c;引用&…

.NET 8 中的调试增强功能

作者&#xff1a;James Newton-King 排版&#xff1a;Alan Wang 开发人员喜欢 .NET 强大且用户友好的调试体验。您可以在您选择的 IDE 中设置断点&#xff0c;启动已经附加上调试器的程序&#xff0c;逐步执行代码并查看 .NET 应用程序的状态。 在 .NET 8 中&#xff0c;我们致…

ceph版本和Ceph的CSI驱动程序

ceph版本和Ceph的CSI驱动程序 ceph查看ceph版本Ceph的CSI驱动程序 ceph ceph版本和Ceph的CSI驱动程序 查看ceph版本 官网ceph-releases-index Ceph的CSI驱动程序 Ceph的CSI驱动程序 https://github.com/ceph/ceph-csi

微信小程序在TS模板下引入TDesign组件

介绍 TDesign 是腾讯官方出品的一款微信小程序组件库。本文介绍如何在新建ts空白模板下引入TDesign库 步骤 新建一个空白项目&#xff0c;这里可以选择TS-基础模板 新建项目目录结构如图所示&#xff1a; 注意这里其实小程序的文件都存放在miniprogram文件夹下&#xff0c;…

MPP 架构在 OLAP 数据库的运用

MPP 架构&#xff1a; MPP 架构的产品&#xff1a; Impala ClickHouse Druid Doris 很多 OLAP 引擎都采用了 MPP 架构 批处理系统 - 使用场景分钟级、小时级以上的任务&#xff0c;目前很多大型互联网公司都大规模运行这样的系统&#xff0c;稳定可靠&#xff0c;低成本。…

vscode刷leetcode使用Cookie登录

1、安装插件 打开vscode&#xff0c;选择扩展&#xff0c;搜索leetcode&#xff0c;选择第一个&#xff0c;带有中文力扣字样&#xff0c;安装后重启 2、切换 选择这个小球&#xff0c;切换中文版本&#xff0c;切换后&#xff0c;会显示一个打勾 3、 选择小球旁边的有箭…

ES6 class类的静态方法static有什么用

在项目中&#xff0c;工具类的封装经常使用静态方法。 // amap.jsimport AMapLoader from amap/amap-jsapi-loader; import { promiseLock } from triascloud/utils; /*** 高德地图初始化工具*/ class AMapHelper {static getAMap window.AMap? window.AMap: promiseLock(AM…

kafka顺序读写磁盘分析

Kafka是一种流行的分布式消息系统&#xff0c;它具有高吞吐量、可扩展性和可靠性等特点。其中一个重要的技术特点是它能够保证消息的顺序写磁盘&#xff0c;从而保证了消息的顺序性和一致性。本文将从Kafka服务端源码的角度&#xff0c;对Kafka实现顺序写磁盘的原理进行分析&am…

c语言:通讯录管理系统(动态分配内存版)

前言&#xff1a;在大多数高校内&#xff0c;都是通过设计一个通讯录管理系统来作为c语言课程设计&#xff0c;通过一个具体的系统设计将我们学习过的结构体和函数等知识糅合起来&#xff0c;可以很好的锻炼学生的编程思维&#xff0c;本文旨在为通讯录管理系统的设计提供思路和…

山海鲸汽车需求调研系统:智慧决策的关键一步

随着社会的发展和科技的进步&#xff0c;汽车行业也迎来了新的挑战和机遇。如何更好地满足用户需求、提高产品竞争力成为了汽车制造商们关注的焦点。在这个背景下&#xff0c;山海鲸汽车需求调研互动系统应运而生&#xff0c;为汽车行业赋予了智慧决策的力量。 智慧决策的核心&…

Idea本地跑flink任务时,总是重复消费kafka的数据(kafka->mysql)

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Idea中执行任务时&#xff0c;没法看到JobManager的错误&#xff0c;以至于我以为是什么特殊的原因导致任务总是反复消费。在close方法中&#xff0c;增加日志&#xff0c;发现jdbc连接被关闭了。 重新…

redis 主从复制

配从不配主 主要开启密码 在redis.conf requirepass xxxx 在从机配置 查看主从关系 在主机或从机执行 info replication 注意点 从机可以读&#xff0c;但没有写的权限主从机同时启动&#xff0c; 主机写一个命令&#xff0c;从机复制一个命令 主机开启动&#xff0c;写入命…

【智慧燃气】智慧燃气解决方案总体概述--终端层、网络层

关键词&#xff1a;智慧燃气、智慧燃气系统、智慧燃气平台、智慧燃气解决方案、智慧燃气应用、智能燃气 智慧燃气解决方案是基于物联网、大数据、云计算、移动互联网等先进技术&#xff0c;结合燃气行业特征&#xff0c;通过智能设备全面感知企业生产、环境、状态等信息的全方…

linux下Qt的pro文件

生成生成文件后缀名的说明。这只是泛泛而谈&#xff0c;实际发现跟编译器有关。比如在windows系统上用MinGW&#xff0c;可能静态库还是a后缀。 文件静态库动态库目标文件LINUXasooWINDOWSlibdllobj 在.pro文件中&#xff0c;INCLUDEPATH用于引入外部库的头文件&#xff0c;L…

嵌入式面试:大疆 2023 春招

文章目录 一、笔试SPI的四种模式&#xff1a;模式0 (CPOL0; CPHA0)模式1 (CPOL0; CPHA1)模式2 (CPOL1; CPHA0)模式3 (CPOL1; CPHA1) 一、笔试 SPI的四种模式&#xff1a; CPOL (Clock POlarity)&#xff1a;决定时钟极性 CPHA (Clock PHAse)&#xff1a;决定时钟相位 modeCP…