设计模式-03 设计模式-工厂模式factory-内部工厂

设计模式-03 设计模式-工厂模式factory-内部工厂

目录

设计模式-03 设计模式-工厂模式factory-内部工厂

         1.定义

2.内涵

3.案例对比

4.特点

4.总结


1.定义

内部工厂模式是一种创建类对象的方式,其中工厂方法被封装在类内部,客户端只能通过类的公共接口来访问。

2.内涵
  • 松耦合:客户端代码与具体的产品类解耦,只与工厂类交互。
  • 可扩展性:可以在不影响客户端代码的情况下轻松添加或删除产品类。
  • 封装:产品类的创建过程被封装在工厂类中,隐藏了实现细节。
  • 可控制:工厂类可以控制创建过程,例如限制实例的数量或满足某些条件。
  • 可测试:更容易单元测试工厂类,因为可以模拟产品类的行为。
  • 单一职责原则:工厂类负责创建对象,而产品类负责实现特定行为,遵循单一职责原则。
  • 减少冗余:避免在客户端代码中重复创建逻辑。
  • 可扩展性:可以通过将新的工厂方法添加到内部工厂类来轻松添加新的产品类型。
  • 可维护性:由于创建过程被封装在内部,因此更容易维护和更改。

3.案例对比
//
// Created by Administrator on 2024/5/4.
//
//
// 独立类
// factory on 2024/5/3.
//
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <fstream>
#include <tuple>
#include <sstream>
#include <memory>
#include <cmath>
using namespace std;enum class PointType
{cartesian,polar
};struct Point
{Point(float x, float y):x(x),y(y){}float x, y;public:friend ostream &operator<<(ostream &os, const Point &point){os << "X:" << point.x << " Y:" << point.y << endl;return os;}struct PointFactory{PointFactory(){}static Point NewCartesian(float x, float y){return {x,y};}static Point NewPolar(float rho, float theta){return {rho*cos(theta), rho*sin(theta)};}};
};int main()
{auto p = Point::PointFactory::NewPolar(5, 3.1415 / 4);cout << p <<endl;Point p2 = {0.5, 0.4};cout << p2 <<endl;}

代码中的类 PointFactory定义在 Point 类内部,并且起到一个工厂类的作用。

4.特点

内部工厂模式比其他创建模式更合适的情况包括:

  •  子类创建和管理自己的实例:内部工厂模式允许子类创建和管理自己的实例,而无需通过外部或父级工厂介入。这在需要有多个工厂来生成特定类型对象的不同变体或实现时很有用。
  •  控制对象创建过程:内部工厂模式使子类能够控制创建过程,自定义如何创建和配置对象。这在需要根据特定条件或参数动态创建对象的场景中特别有用。
  •  隐藏复杂性:内部工厂模式可以将复杂的对象创建逻辑隐藏在子类内部。客户端代码只需使用工厂方法即可创建对象,而无需了解创建过程的具体细节。这有助于提高代码的可读性和可维护性。
  •  代码重用:通过将对象创建逻辑封装在子类中,内部工厂模式允许代码重用。每个子类可以定义其自己的特定创建逻辑,避免重复代码。
  •  可扩展性:内部工厂模式很容易扩展,因为可以创建新的子类来处理其他类型的对象创建。这提高了代码库的可扩展性和灵活性。
  • 与抽象工厂和建造者模式不同,内部工厂模式:
  •  不需要显式的工厂层:对象是由子类自己创建的,而不是通过外部工厂。
  •  更具体化:子类可以自定义对象创建逻辑,而其他模式提供了更通用的创建过程。
  •  更轻量级:它通常比其他模式更轻量级,因为不需要外部工厂或复杂的配置过程。
4.总结

内部工厂模式允许子类创建和管理自己的实例,而无需通过外部或父级工厂介入。这在需要有多个工厂来生成特定类型对象的不同变体或实现时很有用。如果符合这种场景,可以采用内部工厂设计模式。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

D2-一种将文本转换为图表的现代图表脚本语言

&#x1f310; 开源页面 https://github.com/terrastruct/d2 &#x1f310; 在线体验 https://play.d2lang.com/ 与同类型工具对比 &#x1f4c4;通过简单的描述文本&#xff0c;D2 便会自动生成高质量图表&#xff0c;该脚本语言简单易用&#xff0c;可定制性强&#xff0c;…

【电路笔记】-Twin-T振荡器

Twin-T振荡器 文章目录 Twin-T振荡器1、概述2、Twin-T振荡器3、Twin-T放大4、Twin-T 振荡器示例5、总结Twin-T 振荡器是另一种 RC 振荡器电路,它使用两个并联的 RC 网络来产生单一频率的正弦输出波形。 1、概述 Twin-T 振荡器是另一种类型的 RC 振荡器,它产生正弦波输出,用…

Go实战训练之Web Server 与路由树

Server & 路由树 Server Web 核心 对于一个 Web 框架&#xff0c;至少要提供三个抽象&#xff1a; Server&#xff1a;代表服务器的抽象Context&#xff1a;表示上下文的抽象路由树 Server 从特性上来说&#xff0c;至少要提供三部分功能&#xff1a; 生命周期控制&…

Linux理解文件操作 文件描述符fd 理解重定向 dup2 缓冲区 C语言实现自己的shell

文章目录 前言一、文件相关概念与操作1.1 open()1.2 close()1.3 write()1.4 read()1.4 写入的时候先清空文件内容再写入1.5 追加&#xff08;a && a&#xff09; 二、文件描述符2.1 文件描述符 fd 0 1 2 的理解2.2 FILE结构体&#xff1a;的源代码 三、深入理解文件描述…

npm安装依赖报错解决办法

项目场景&#xff1a; 安装gitee上的开源vue3TS项目&#xff0c;npm安装依赖报错 问题描述 克隆项目到VSCode之后&#xff0c;使用npm install安装依赖&#xff0c;报错 npm install npm ERR! code ENOENT npm ERR! syscall open npm ERR! path Y:\WebStudyBlog\MovieWeb/p…

@Configuration自身循环依赖及解决办法

前言 最近做项目&#xff0c;把项目旧的Springboot框架升级到比较新的一个版本2.7.x&#xff0c;是最后支持JDK8的版本&#xff0c;JDK8寿命真长&#xff0c;不过pagehelper报了自身循环依赖的问题&#xff0c;解决方式也很简单&#xff0c;升级pagehelper的版本即可&#xff…

C++Linux系统编程——Linux基本命令(究极全)

1.Linux常见目录介绍 /&#xff1a;根目录&#xff0c;一般根目录下只存放目录&#xff0c;在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”&#xff0c;你其实是在告诉电脑&#xff0c;先从/&#xff08;根目录&#xff09;开始&#xff0…

Java进阶【十三期】:【异常处理】 (抛出捕获异常、自定义异常处理)、处理异常的几种方式 【(File】文件路径操作、File文件处理的综合练习

文章目录 Java进阶【十三期】&#xff1a;异常处理一、异常基本介绍二、编译异常和运行异常三、总结 异常的作用异常的处理方式一、JVM默认的处理方式二、自己处理异常自己 处理的问题 三、总结 Throwable 成员方法抛出异常总结 异常练习自定义异常 FileFile 三个 构造方法File…

Linux实现简单进度条(附原理解释和动图效果)

1&#xff0c;行缓冲区 先看下面的代码和运行结果&#xff0c; #include<stdio.h> #include<unistd.h> int main() {printf("你好\n");sleep(3);return 0; }只是一个简单的打印“你好”然后休眠三秒&#xff0c;最后程序结束 再看下面的代码和运行结果…

从零到屎山系列-游戏开发(Day2)

简介 这次就来一个比较简单的小游戏贪吃蛇 贪吃蛇 游戏规则就是一串珠子不断的移动&#xff0c;碰到场景里面的食物变长一点&#xff0c;碰到墙壁游戏结束。 开始动手 设计绘制设备 首先我计划从一个控制台游戏开始&#xff0c;需要一个控制台下的绘图机制&#xff0c;希…

【C++】学习笔记——vector_2

文章目录 七、vector2. vecotr的使用3. vector的模拟实现 未完待续 七、vector 2. vecotr的使用 上节我们以二维数组结束&#xff0c;这一节我们以二维数组开始。 // 二维数组 vector<vector<int>> vv;二维数组在底层是连续的一维数组。vv[i][j] 是怎样访问的&a…

《Fundamentals of Power Electronics》——基础交流建模方法

PWM整流器小信号交流模型建模的主要步骤为&#xff1a; (a)利用小纹波近似的动态版本&#xff0c;建立与电感和电容波形的低频平均值有关的方程&#xff1b; (b)平均方程的扰动和线性化&#xff1b; (c)交流等效电路模型的建立。 以下图buck-boost电路为例进行分析。 首先测…

sofeSim vs eSIM vs iSIM

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). ### SIM的演变 - 传统的SIM卡有多种尺寸或形态因子&#xff0c;包括1FF、2FF&#xff08;mini&#xff09;、3FF&#xff08;mic…

Pandas标签库

目录 1.创建对象 1.一维对象 1.字典创建法 2.数组创建法 2.二维对象 1.字典创建法 2.数组创建法 2.对象的索引 1.一维对象的索引 1.查询 2.切片 2.二维对象的索引 1.访问 2.修改 3.对象的变形 1.对象的转置 2.上下翻转和左右翻转 3.对象的重塑 4.一维对象的合…

C#语言基础

一、复杂数据类型 1. 枚举 1.1 基本概念 1.1.1 枚举是什么 枚举是一个被命名的整型常量的集合&#xff0c;一般用它来表示状态、类型等等 1.1.2 申明枚举和申明枚举变量 申明枚举和申明枚举变量是两个概念 申明枚举&#xff1a;相当于是创建一个自定义的枚举类型 申明枚…

CMakeLists.txt语法规则:部分常用命令说明二

一. 简介 前一篇文章学习了CMakeLists.txt语法中 add_executable命令&#xff0c;add_library命令&#xff0c;add_subdirectory 命令的简单使用。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;部分常用命令说明一-CSDN博客 本文继续学习 CMakeLists.txt语法中…

开源免费的网盘项目Cloudreve,基于Go云存储个人网盘系统源码(七牛、阿里云 OSS、腾讯云 COS、又拍云、OneDrive)

项目简介&#xff1a; 在现今的网盘服务中&#xff0c;用户经常遭遇限速和价格上涨的问题&#xff0c;这无疑增加了使用上的困扰。 为此&#xff0c;我今天要介绍一款开源且免费的网盘项目——Cloudreve。 这个项目是基于Go语言开发的云存储个人网盘系统&#xff0c;支持多种…

从0开始linux(1)——文件操作

欢迎来到博主的专栏——从0开始linux 博主ID&#xff1a;代码小豪 博主使用的linux发行版是&#xff1a;CentOS 7.6 不同版本下的操作可能存在差异 文章目录 命令文件操作命令文件树和文件路径文件树绝对路径相对路径 文件属性tree指令删除文件复制文件 大家还记得在小学第一次…

第六篇:Python编程精粹:深入常用库与高效开发实践

Python编程精粹&#xff1a;深入常用库与高效开发实践 1 引言&#xff1a; 在数字世界中&#xff0c;Python已然成为一种杰出的工具&#xff0c;它的优雅、简洁和强大功能吸引了无数的开发者和研究者。Python之所以在多个领域内占据主导地位&#xff0c;一个重要的原因在于其强…

微图乐 多种装B截图一键制作工具(仅供娱乐交流)

软件介绍 采用exe进程交互通信。全新UI界面&#xff0c;让界面更加清爽简约。支持zfb、VX、TX、Yin行、Dai款、游戏等图片生成&#xff0c;一键超清原图复制到剪辑板&#xff0c;分享给好友。适用于提高商家信誉度&#xff0c;产品销售额度。装逼娱乐&#xff0c;用微图乐。图…