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

devtools/2024/9/24 21:23:15/
设计模式-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/devtools/33837.html

相关文章

消费品行业的5G新时代:2024年消费品行业趋势洞察报告

来源&#xff1a;安永 2023 年&#xff0c;我国社会消费品零售总额达人民币 47.147.147.147.1万亿元&#xff0c;比上年增长 7.2%7.2%7.2%7.2%&#xff1b;最终 消费支出拉动经济增长 4.34.34.3个百分点&#xff0c;比上年提高 3.13.13.1个百分点&#xff0c;对经济增长的贡献…

分类预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测

分类预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测 目录 分类预测 | Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现POA-BP鹈鹕算法优化BP神经网络多特征分类预测&#xff08;Matlab实…

大模型T5

近年来&#xff0c;在大规模预训练语言模型上&#xff0c;各大公司的军备竞赛卷得十分激烈&#xff01; 本文我们介绍Google推出的大一统模型——T5&#xff0c;同样是数据和实验多得让你瞠目结舌的论文&#xff0c;没错&#xff0c;就是在炫富&#xff0c;你有钱你也可以烧啊…

力扣经典150题第五十五题:逆波兰表达式求值

目录 题目描述和要求示例解释解题思路算法实现复杂度分析测试和验证总结和拓展参考资料 题目描述和要求 给你一个字符串数组 tokens&#xff0c;表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式&#xff0c;并返回一个表示表达式值的整数。 注意&#xff1a; 有…

react18子组件设置接收默认值和值类型验证

父组件传值 import ChildCom from ./components/ChildCom export default function Person {return(<div><ChildCom name"alan-ben" age{18} score{[98, 97, 100]} /></div>) } 子组件接收并验证类型 import React from react import PropTypes…

32 OpenCV Harris角点检测

文章目录 cornerHarris 算子示例 角点检测 cornerHarris 算子 void cv::cornerHarris ( InputArray src,OutputArray dst,int blockSize,int ksize,double K,int borderType BORDER_DEFAULT) src:待检测Harris角点的输入图像&#xff0c;图像必须是CV 8U或者CV 32F的单通道…

九州金榜|孩子休学在家躺平怎么家庭教育

随着社会的进步&#xff0c;教育环境也在不断变化&#xff0c;孩子出现休学在家“躺平”的现象呈现逐年上涨的趋势&#xff0c;孩子出现这种情况&#xff0c;家庭教育就现在尤为重要。作为家长&#xff0c;不应该先去批评孩子&#xff0c;而是以一颗包容的心和理解的态度帮助孩…

MATLAB R2024a主要更新内容及发布亮点

MATLAB作为一款广泛应用于工程和科学计算领域的软件&#xff0c;也在不断进行更新和迭代。MathWorks公司发布了MATLAB R2024a版本&#xff0c;该版本在多个方面进行了重要更新&#xff0c;并带来了一系列亮点。本文将详细介绍MATLAB R2024a的主要更新内容以及发布亮点。 一、主…