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

news/2024/9/22 15:09:52/
设计模式-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.ppmy.cn/news/1453556.html

相关文章

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包&#xff08;英语&#xff1a;Closure&#xff09;&#xff0c;又称词法闭包&#xff08;Lexical Closure&#xff09;或函数闭包&#xff08;function closures&#xff09;&#xff0c;是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在&#xff0c;即使…

EPAI手绘建模APP图层、相机、灯光

④ 图层列表 1) 添加图层。 2) 列表显示场景中所有图层。初始时&#xff0c;默认有一个激活的图层。场景中所有模型都会添加到这个图层。 3) 第一次点击图层名称旁边的可见按钮&#xff0c;图层中所有模型都不可见&#xff0c;再次点击&#xff0c;图层中所有模型可见。 4)…

【MySql】FIND_IN_SET 字符串逗号分隔,判断是否包含某字符串

FIND_IN_SET 字符串逗号分隔&#xff0c;判断是否包含某字符串 一、FIND_IN_SET FIND_IN_SET 返回某字符串在一串有逗号组成的字符串集合(SET)中的第几位&#xff0c;不存在时为0 -- 查询结果&#xff1a;4 SELECT FIND_IN_SET( ad, ac,ab,aa,ad )-- 查询结果&#xff1a;0 …

AcWing算法基础课笔记 ------ 第五章 动态规划

文章目录 一. 线性dp1. 数字三角形2. 最长上升子序列3. 最长公共子序列 二. 区间dp1. 石子合并 三. 计数类dp1. 整数划分 四. 状态压缩dp1. 蒙德里安的梦想2. 最短Hamilton路径 五. 树形dp1. 没有上司的舞会 六. 记忆化搜索1. 滑雪 本篇文章是在Acwing种学习动态规划的笔记题解…

公共交通无障碍设施:科技翅膀助力盲人出行新飞跃

在城市的脉络中&#xff0c;公共交通扮演着连接每一个角落的重要角色。然而&#xff0c;对于视力受限的盲人朋友而言&#xff0c;这幅繁忙而复杂的交通网络往往隐藏着诸多不易察觉的障碍。值得庆幸的是&#xff0c;随着公共交通无障碍设施的不断完善&#xff0c;以及高科技辅助…

Python语言例题集(013)

#!/usr/bin/python3 #建立循环链表。 class Node(): def init(self,dataNone): self.datadata self.nextNone n1Node(5) n2Node(15) n3Node(25) n1.nextn2 n2.nextn3 n3.nextn1 ptrn1 counter1 while counter<6: print(ptr.data) ptrptr.next counter1

1.4 Java全栈开发前端+后端(全栈工程师进阶之路)-前置课程java基础语法、java面向对象编程

Java核心语法&#xff1a; 对象&#xff1a;对象是类的一个实例&#xff08;对象不是找个女朋友&#xff09;&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的状态有&#xff1a;颜色、名字、品种&#xff1b;行为有&#xff1a;摇尾巴、叫、吃等。…

综合性练习(后端代码练习4)——图书管理系统

目录 一、准备工作 二、约定前后端交互接口 1、需求分析 2、接口定义 &#xff08;1&#xff09;登录接口 &#xff08;2&#xff09;图书列表接口 三、服务器代码 &#xff08;1&#xff09;创建一个UserController类&#xff0c;实现登录验证接口 &#xff…