《设计模式的艺术》笔记 - 简单工厂模式

介绍

        定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有相同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂方法模式,属于类创建型模式

实现

class Product {
public:void methodSame() { // 公共方法的实现std::cout << "methodSame" << std::endl;}virtual void methodDiff() = 0;  // 抽象方法的声明,由具体产品实现
};class ConcreteProductA : public Product {
public:void methodDiff() override {std::cout << "ConcreteProductA" << std::endl;}
};class ConcreteProductB : public Product {
public:void methodDiff() override {std::cout << "ConcreteProductB" << std::endl;}
};class Factory {
public:static Product *getProduct(std::string arg) {Product *product = NULL;if (arg == "A") {product = new ConcreteProductA();} else if (arg == "B") {product = new ConcreteProductB();}return product;}
};int main() {Product *A = Factory::getProduct("A");A->methodSame();A->methodDiff();Product *B = Factory::getProduct("B");B->methodSame();B->methodDiff();return 0;
}

简单工厂模式的简化

        将Factory合并到父类Product中,此时必须分别在头文件和源代码文件中分开编写,不然编译报错

class Product {
public:void methodSame();virtual void methodDiff() = 0;  // 抽象方法的声明,由具体产品实现static Product *getProduct(std::string arg);
};class ConcreteProductA : public Product {
public:void methodDiff() override;
};class ConcreteProductB : public Product {
public:void methodDiff() override;
};
#include "myclass.h"void Product::methodSame() { // 公共方法的实现std::cout << "methodSame" << std::endl;
}Product* Product::getProduct(std::string arg) {Product *product = NULL;if (arg == "A") {product = new ConcreteProductA();} else if (arg == "B") {product = new ConcreteProductB();}return product;
}void ConcreteProductA::methodDiff() {std::cout << "ConcreteProductA" << std::endl;
}void ConcreteProductB::methodDiff() {std::cout << "ConcreteProductB" << std::endl;
}

总结

        优点:       

        1. 工厂类包含必要的判断逻辑,可以决定什么时候创建哪一个产品类的实例。

        2. 客户端无须知道所创建的具体产品类的类名,只需要知道对应的参数即可。

        3. 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

        缺点:

        1. 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。

        2. 使用简单工厂模式势必会增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度。

        3. 系统扩展困难。一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

        4. 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

练习

        使用简单工厂模式设计一个可以创建不同几何形状(如圆形、方形和三角形等)的绘图工具,每个几何图形都具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,提示一个UnSupportedShapeException。

myclass.h

//
// Created by yuwp on 2024/1/12.
//#ifndef DESIGNPATTERNS_CLASS_H
#define DESIGNPATTERNS_MYCLASS_H#include <iostream>class Graphical {
public:virtual void draw() = 0;virtual void erase() = 0;static Graphical *getGraphical(std::string arg);
};class Circle : public Graphical {
public:void draw() override;void erase() override;
};class Square : public Graphical {
public:void draw() override;void erase() override;
};class Triangle : public Graphical {
public:void draw() override;void erase() override;
};class UnSupportedShapeException : public std::exception {
public:UnSupportedShapeException() {};~UnSupportedShapeException() {};const char* what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT override;
};#endif //DESIGNPATTERNS_CLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//#include "myclass.h"Graphical* Graphical::getGraphical(std::string arg) {if (arg == "circle") {return new Circle();} else if (arg == "square") {return new Square();} else if (arg == "triangle") {return new Triangle();} else {throw UnSupportedShapeException();}
}void Circle::draw() {std::cout << "Draw circle" << std::endl;
}void Circle::erase() {std::cout << "Erase circle" << std::endl;
}void Square::draw() {std::cout << "Draw square" << std::endl;
}void Square::erase() {std::cout << "Erase square" << std::endl;
}void Triangle::draw() {std::cout << "Draw triangle" << std::endl;
}void Triangle::erase() {std::cout << "Erase triangle" << std::endl;
}const char* UnSupportedShapeException::what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT {return "Unsupported shape";
}

main.cpp

#include <iostream>
#include <mutex>
#include "myclass.h"int main() {Graphical *graph;try {graph = Graphical::getGraphical("circle");graph->draw();graph->erase();graph = Graphical::getGraphical("square");graph->draw();graph->erase();graph = Graphical::getGraphical("triangle");graph->draw();graph->erase();graph = Graphical::getGraphical("unknown");graph->draw();graph->erase();} catch (const std::exception &e) {std::cout << e.what() << std::endl;}return 0;
}

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

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

相关文章

Nginx——基础配置

和大多数软件一样&#xff0c;Nginx也有自己的配置文件&#xff0c;但它又有很多与众不同的地方&#xff0c;本帖就来揭开Nginx基础配置的面纱。 1、Nginx指令和指令块 了解指令和指令块有助于大家了解配置的上下文&#xff0c;下面是一个配置模板示例&#xff1a; 在这个配…

ElasticSearch 7.x 版本使用 BulkProcessor 实现批量添加数据

ElasticSearch 1、ElasticSearch学习随笔之基础介绍 2、ElasticSearch学习随笔之简单操作 3、ElasticSearch学习随笔之java api 操作 4、ElasticSearch学习随笔之SpringBoot Starter 操作 5、ElasticSearch学习随笔之嵌套操作 6、ElasticSearch学习随笔之分词算法 7、ElasticS…

使用numpy处理图片——缩放图片

缩放图片是让图片丢失部分像素&#xff0c;从而导致图片失真。一种比较简单的方法就是抽取法。比如如果我们要将照片在宽度上缩小50%&#xff0c;则可以在第二维度上每隔2个像素取一个像素来保存&#xff1b;类似的&#xff0c;如果我们希望在高度上缩小50%&#xff0c;则可以在…

AUTO SEG-LOSS SEARCHING METRIC SURROGATES FOR SEMANTIC SEGMENTATION

AUTO SEG-LOSS: 搜索度量替代语义分割 论文链接&#xff1a;https://arxiv.org/abs/2010.07930 项目链接&#xff1a;https://github.com/fundamentalvision/Auto-Seg-Loss ABSTRACT 设计合适的损失函数是训练深度网络的关键。特别是在语义分割领域&#xff0c;针对不同的场…

腾讯云服务器建站教程——2024更新部署网站教程

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com分享使用腾讯云服务器建站教程&#xff0c;…

【复现】Spider-Flow RCE漏洞(CVE-2024-0195)_16

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫…

基于SSM的电脑测评系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电脑测评系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

Codeforces Round 911 (Div. 2) C. Anji‘s Binary Tree (DFS + 树)

题目 思路: dfs树的每一条到叶子的路径, 并计算路径中需要修改的个数, 在这些个数中取最小值 注意: 本题中的树是以每个结点的左右孩子是什么的形式给出的, 所以可以不用建树, 只需保存每个结点的左右孩子是什么即可。 代码&#xff1a; #include<bits/stdc.h> using…

Docker登录MySQL,密码正确却提示密码错误

当我输入了正确的MySQL密码的时候确提示我密码错误&#xff1a; ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES) docker run --name mysql_master \ -e MYSQL_ROOT_PASSWORD123123 \ -v /root/mysql_master/data:/var/lib/mysql \ -v /root…

Postgresql常见(花式)操作完全示例

案例说明 将Excel数据导入Postgresql&#xff0c;并实现常见统计&#xff08;数据示例如下&#xff09; 导入Excel数据到数据库 使用Navicat工具连接数据库&#xff0c;使用导入功能可直接导入&#xff0c;此处不做过多介绍&#xff0c;详细操作请看下图&#xff1a; 点击“下…

点云从入门到精通技术详解100篇-基于多传感器融合的智能汽车 环境感知(下)

目录 基于激光雷达点云的目标检测 4.1 点云神经网络检测模型 4.2 点云预处理

SCI一区级 | Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多变量多步时序预测

SCI一区级 | Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多…

npx和npm有什么区别,包管理器yarn的使用方法,node的版本管理工具nvm使用方法

文章目录 一、npx介绍及使用1、npx 是什么2、npx 会把远端的包下载到本地吗?3、npx 执行完成之后&#xff0c; 下载的包是否会被删除&#xff1f;4、npx和npm的区别 二、yarn介绍及使用1、Yarn是什么&#xff1f;2、Yarn的常见场景&#xff1a;3、Yarn常用命令 三、nvm介绍及使…

vue3基础:单文件组件介绍

介绍 Vue 的单文件组件 (即 *.vue 文件&#xff0c;简称 SFC&#xff0c;全称是single file component) 是一种特殊的文件格式&#xff0c;使我们能够将一个 Vue 组件的模板、逻辑与样式封装在单个文件中。下面是一个单文件组件的示例&#xff1a; <script> export def…

Ubuntu root 远程登录失败

背景&#xff1a;设置了两个系统用户&#xff1a;root、test&#xff1b;test可以登录&#xff0c;可以使用su 命令切换root用户登录成功&#xff1b; 但是直接用root登录&#xff0c;会报错。 查看登录日志的方法&#xff1a; 需要两个远程窗口&#xff0c;在第一个远程窗口…

日志审计系统Agent项目创建——初始化数据库和日志文件(Linux版本)

1、定义和初始化函数&#xff1a; bool Init(std::string ip); 1.1、获取ip地址&#xff0c;这里的ip地址是通过makefile文件直接设定的。 bool XAgent::Init(string ip) {if (ip.empty()){cerr << "Agent::init failed! ip is empty" << endl;return…

力扣|2023华为秋招冲刺

文章目录 第一关&#xff1a;2023 年 7 月面试题挑战第二关&#xff1a;2023 年 6 月面试题挑战第三关&#xff1a;2023 年 5 月面试题挑战 第一关&#xff1a;2023 年 7 月面试题挑战 class Solution { public:void reverseWord(vector<char>& s,int l,int r){for(i…

单片机学习记录(一)

简答题 第1章 1.微处理器、微计算机、CPU、单片机、嵌入式处理器他们之间有何区别&#xff1f; 答&#xff1a;微处理器、CPU都是中央处理器的不同称谓&#xff0c;微处理器芯片本身不是计算机&#xff1b; 单片机、微计算机都是一个完整的计算机系统&#xff0c;单片机是集…

关于Python里xlwings库对Excel表格的操作(三十二)

这篇小笔记主要记录如何【如何使用“Chart类”、“Api类"和“Axes函数”设置坐标轴标题文本内容】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库…

建筑钢筋表面为什么加上螺纹呢?

问题描述&#xff1a; 建筑钢筋表面为什么加上螺纹呢&#xff1f; 问题解答&#xff1a; 增加黏附力&#xff1a; 螺纹结构提供更多摩擦力&#xff0c;加强钢筋与混凝土之间的粘附&#xff0c;防止滑动或剥离&#xff0c;提高结构的稳定性和强度。 提高抗拉强度&#xff1a;…