设计模式(2)--对象创建(3)--工厂方法

1. 意图

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。

    工厂方法使一个类的实例化延迟到其子类。

2. 四种角色

    抽象产品、具体产品、抽象构造者、具体构造者

3. 优点

    3.1 仅处理抽象产品(Product)接口

    3.2 给子类一个钩子(hook)以提供对象的扩展版本(父类有个缺省版本)

    3.3 可以连接平行的类层次(职责委托)

4. 缺点

    4.1 可能为了创建一个特定的具体产品对象,不得不创建一个具体构造者。

5. 相关模式

    5.1 抽象工厂经常用工厂方法来实现

    5.2 工厂方法通常在模板方法中被调用

    5.3 原型不需要创建Creator子类,但需要Creator初始化产品对象,工厂方法则不需要。

6. 代码示意(C++)
#pragma once
#include <iostream>
using namespace std;

class Product
{
public:
	virtual void Operation1() = 0;
	virtual void Operation2() = 0;
};
class ConcreteProduct1 : public Product
{
public:
	virtual void Operation1() {
		cout << "ConcreteProduct1:操作1" << endl;
	}
	virtual void Operation2() {
		cout << "ConcreteProduct1:操作2" << endl;
	}
};
class ConcreteProduct2 : public Product
{
public:
	virtual void Operation1() {
		cout << "ConcreteProduct2:操作1" << endl;
	}
	virtual void Operation2() {
		cout << "ConcreteProduct2:操作2" << endl;
	}
};

class Creator
{
public:
	void Operation1()
	{
		Product* pProduct = FactoryMethod();
		pProduct->Operation1();
		delete pProduct;
	}
	void Operation2()
	{
		Product* pProduct = FactoryMethod();
		pProduct->Operation2();
		delete pProduct;
	}
public:
	virtual Product* FactoryMethod() = 0;
};

class ConcreteCreator1 : public Creator
{
public:
	virtual Product* FactoryMethod() {
		return new ConcreteProduct1;
	}

};
class ConcreteCreator2 : public Creator
{
public:
	virtual Product* FactoryMethod() {
		return new ConcreteProduct2;
	}

};
#include "Creator.h"
int main() {

	Creator* pCreator = new ConcreteCreator1;
	Product* pProduct = pCreator->FactoryMethod();
	pProduct->Operation1();
	pProduct->Operation2();
	
	delete pProduct;
	delete pCreator;

	pCreator = new ConcreteCreator2;
	pCreator->Operation1();
	pCreator->Operation2();

	delete pCreator;
	return 0;
}

运行结果:

6.1 可以直接操作Product的接口(3.1),也可以通过Creator操作

6.2 增加ConcreteProduct3,需要增加对应的ConcreteCreator3(4.1)

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

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

相关文章

C/C++ 快乐数: 编写一个算法来判断一个数n是不是快乐数

题目&#xff1a; 编写一个算法来判断一个数n是不是快乐数。 快乐数的定义&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 如果这个过…

面试必备的Linux常用命令

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 Linux常用命令 1、文件及内容2、网络3、进程服务4、…

C++寻找特殊年号 2023年3月C++一级 电子学会中小学生软件编程C++等级考试一级真题答案解析

目录 C/C寻找特殊年号 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C寻找特殊年号 2023年3月 C编程等级考试一级编程题 一、题目要求 1、编程实现 年号中的每个数之和为20的年号是特殊年号。例如: 2…

计算机操作系统-第十四天

目录 前言 线程 线程机制带来的变化 线程的属性 前言 在还没有引入进程的概念时&#xff0c;系统中的各个程序只能串行执行&#xff0c;即不能边听音乐边QQ聊天&#xff0c;在引入了进程的概念后&#xff0c;就可以实现边听音乐边QQ聊天。 但是我们在使用QQ时除了聊天还会进…

Python实现多种图像去噪方法

Python实现多种图像去噪方法&#xff1a;中值滤波&#xff0c;均值滤波&#xff0c;高通滤波&#xff0c;低通滤波&#xff0c;高斯滤波&#xff0c;同态滤波 图像和视频逐渐成为人们生活中信息获取的重要来源。人们准确地获取信源发出的图像和视频信息需要保证在传输过程中的…

性能优化 vue2/vue3 通过CDN 减少项目启动时间

其实更多可以通过压缩图片等文件大小 也会让项目运行快一些 以及尽量使用异步或者懒加载 使用CDN可以避免在项目中使用npm导入Vue的依赖项&#xff0c;从而减少项目启动时的加载时间 使用方法如下 <!-- Vue 2 --> <script src"https://cdn.jsdelivr.net/npm/vue…

[Linux] Tomcat

一、Tomcat相关知识 1.1 Tomcat的简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;是 Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。 …

防职业掉坑必看,电商设计主要做什么?

今年双十一刚结束&#xff0c;各电商平台不公布总销售额的新闻就上了热搜。外行人乍一看可能觉得消费意愿下降&#xff0c;消费水平降级&#xff0c;电商行业不景气&#xff0c;但实际上电商领域在国内突飞猛进了10几年后&#xff0c;仍然还有很大的上升空间。很多人说&#xf…

shiro入门demo(二)授权

在前面认证的基础上&#xff0c;认证通过后一般还有个授权的操作。授权根据业务需求有两种维度&#xff0c;基于角色的授权和基于资源的授权。 一、授权-基于角色授权&#xff1a; shiro中授权实现方式&#xff1a;有三种 1、编程式 Subject subject SecurityUtils.getSubje…

电路中的repeater是什么?

最近在看interlaken协议&#xff0c;有一个单词&#xff0c;repeater&#xff0c;不知道是什么含义&#xff0c;查了一下发现它的功能是提高数据的完整性&#xff0c;要么是修复时钟&#xff0c;要么是提高信号裕量等。总之是让信号变好的一个东西。 具体可以参见TI的说明。 【…

企业资产负债表API:获取企业资产负债表数据的重要工具

前言 在当今的数字化时代&#xff0c;信息的获取和整合对于企业的决策和规划至关重要。企业资产负债表API是一种强大的工具&#xff0c;可以帮助企业快速、准确地获取资产负债表数据&#xff0c;从而更好地分析财务状况、做出投资决策以及评估经营绩效。本文将介绍企业资产负债…

【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)

阅读导航 引言一、生产者消费者问题&#x1f341;将生产者消费者模型比喻为超市的顾客和供货商 二、C queue模拟阻塞队列的生产消费模型&#xff08;伪代码&#xff09;三、RAII风格的加锁方式1. 简介2. 示例 四、基于Linux操作系统使用C代码&#xff0c;采用RAII风格的加锁方式…

flutter的ListView和SingleChildScrollView有什么区别?他们的使用场景有什么不一样?

文章目录 简介ListViewSingleChildScrollView使用场景的不同 简介 ListView和SingleChildScrollView都是在Flutter中用于处理滚动内容的组件&#xff0c;但它们有一些关键的区别。 ListView 多个子元素&#xff1a; ListView是一个滚动的可滚动组件&#xff0c;通常用于包含多…

写字基本功 - 正确握笔姿势

写字基本功 - 正确握笔姿势 1. 写字基本功 郑文彬 (布衣) 先生 2. 正确握笔步骤 握笔姿势教学 http://www.bebosspen.com/index.php/correct 3. 正确握笔姿势 - 重点解说图 握笔姿势教学 http://www.bebosspen.com/index.php/correct 3.1. 食指 食指低于拇指 两段弯曲勿三…

【价值几十万的仿抖音直播电商系统源码共享】

当下&#xff0c;传统的图文电商模式已经走向没落&#xff0c;以抖音为首的直播电商模式备受用户追捧&#xff0c;它具有实时直播和强互动的特点&#xff0c;是传统电商所不具备的优势。而且&#xff0c;当前正是直播电商的红利期&#xff0c;很多主播和品牌商都通过直播电商业…

[Halcon模块] Halcon13.0查询算子模块归属

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

【C语言 | 指针】数组参数 和 指针参数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

IDEA利用插件完成properties与yml的互相转换(mac与wins通用)

步骤一、插件安装 点击屏幕左上方的IDEA&#xff0c;然后点击Preferences(相当于wins里的settings) 进入后点击Plugins&#xff0c;在插件商城中搜索并安装 Convert YAML and Properties File 这个插件 二、使用 右键选择你需要转换的配置文件&#xff0c;选择Convert YAML …

解决高风险代码:Mass Assignment: Insecure Binder Configuration

Abstract 用于将 HTTP 请求参数绑定到模型类的框架绑定器未显式配置为允许或禁止特定属性 Explanation 为便于开发和提高生产率&#xff0c;现代框架允许自动实例化一个对象&#xff0c;并使用名称与要绑定的类的属性相匹配的 HTTP 请求参数填充该对象。对象的自动实例化和填充…

安装Anaconda和pytorch

首先看下自己电脑是否有英伟达的显卡&#xff0c;如果有的话可以安装GPU版本&#xff0c;没有的话可以安装CPU版本。 CPU版本 1.安装Anaconda 首先去官网下载Anaconda。 点击download&#xff0c;下载的就是最新版本的。 下载完成后&#xff0c;直接运行下步就行 注意到路径…