[GN] 设计模式—— 创建型模式

文章目录

  • 创建型模式
    • 单例模式 -- 确保对象唯一性
      • 饿汉式
      • 懒汉式
      • 优缺点
      • 使用场景
    • 简单工厂模式
      • 例子:
      • 优化
      • 优缺点
      • 适用场景
    • 工厂方法模式--多态工厂的实现
      • 例子
      • 优缺点
      • 适用场景


创建型模式

单例模式 – 确保对象唯一性

用TaskManager类。通过以下三步进行重构

  1. 为了确保TaskManager实例的唯一性,禁止外部直接new来创建对象。需将构造函数改为private
  2. 类变成私有的了,所以外部访问该类对象,需要类内建TaskManager类型的私有静态成员变量tm。供外部访问
  3. 增加一个公有的静态方法、外界去使用tm 去实例化。 [注意 该方法要public]

在这里插入图片描述
单例模式有3个要点:

  • 某个类只能有一个实例;
  • 它必须自行创建这个实例;
  • 它必须自行向整个系统提供这个实例。

上述代码在多线程时候,会出现 创建多个实例。提供两种解决方式

饿汉式

定义静态变量的时候实例化单例类
在这里插入图片描述

懒汉式

不自行实例化,延时加载。
采取双标志
在这里插入图片描述

为了避免多个钱程同时调用getInstonce ( )方法,可以使用关键守synchronized
如果使用双重检查锁定来实现懒汉式单例类,需要在静态成员变量instonce之前增加修饰符volatile,被volatile修饰的成员变量可以确保多个线程都能够正确处理

优缺点

优点: 提供了对唯一实例的受控访问,可以严格控制客户怎么样访问它
缺点:没有抽象层,难以扩展; 单例类职责过重,一定程度违背单一职责原则;

使用场景

  1. 客户调用类的单个实例只允许使用一个公共访问点。除了该公共访问点,不能通过其他途径访问该实例。
    2.系统要求提供一个唯一的序列号生成器或贵源管理器,或着需要考虑赉源消耗太大而只允许创建一个对象。

提示:以下是本篇文章正文内容,下面案例可供参考

简单工厂模式

例子:

图表库举例:
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
完整代码:
在这里插入图片描述

Chart接口充当抽象产品类,其子类HistogromChort、 PieChart和Linehart充当具体产品类,Chart-Factory充当工厂类。

优化

每更换一个Chart对象都需要修改客户端代码中静态工方法的参数,客户端代码将要重新编译。

可以将参数写到XML中,代码中只需要读取配置文件字符。

优缺点

优点
(1) 工厂类包含必要的判断逻辑,决定在什么时候创建哪一个产品类的实例。客户端仅仅“消费”产品。简单工厂模式实现了对象创建和使用的分离。
(2)客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。
(3)通过引入配置文件,可以在不修改任向客户端代码更换和增加新的具体产品类。

缺点
( l)由于工丁厂类集中了所有产品的创建逻辑,职责过重。
(2)使用简单工厂模式势必会增加系统中类的个数(引入了新的工丁厂类)。
(3)系统扩展困难。一旦添加新产品就不得不修改工厂逻辑。

适用场景

  • 工厂类负责创建的对象比较少。由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  • 客户端只知道传入工丁厂类的参数,对于如同创建对象并不关心。

工厂方法模式–多态工厂的实现

简单工厂模式下存在

  • 工厂类过于庞大,包了大量的f…else…代码,导致维护和测试难度增大。
  • 系统扩展不灵活,如果增加新类型的日志记录器,必须修改静态工厂方法的业务逻辑,违反了开闭原则。

简单工厂模式只有一个工厂 需要知道每个产品创建细节

由此工厂方法产生:

例子

图表库举例:
在这里插入图片描述

ConcreteFactory 具体工厂; Factory 抽象工厂
ConcreteProduct 具体产品 与 具体工厂一一应对; Product 抽象产品

完整代码:
在这里插入图片描述

优缺点

优点

  • 用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
  • 它能够让工厂可以自主确定创建同种产品对象,而如同创建这个对象的细节则究全封装在具体工厂内部。
  • 加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加

缺点

  • 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,在一定程度上增加了系统的复杂度。
  • 考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度

适用场景

  • 客户端不知道其所需要的对象的类。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建,可将具体工厂类的类名存储在配置文件或数据库中。
  • 抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中,抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则

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

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

相关文章

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch01-2 完整定常系统——杆组RRR

本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有帮助请引用 本文参考: 《空间机构的分析与综合(上册)》-张启先…

redis-4 集群

应用场景 为什么需要redis集群? 当主备复制场景,无法满足主机的单点故障时,需要引入集群配置。 一般数据库要处理的读请求远大于写请求 ,针对这种情况,我们优化数据库可以采用读写分离的策略。我们可以部 署一台主服…

【网络基础】mac地址

以太网 以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等; 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等; 以太网是当前应用最广泛的局域…

Win10无法完成更新正在撤销更改的解决方法

在Win10电脑操作过程中,用户看到了“无法完成更新正在撤销更改”的错误提示,这样系统就不能成功完成更新,不知道如何操作才能解决此问题?以下小编分享最简单的解决方法,帮助大家轻松解决Win10电脑无法完成更新正在撤销…

Python实现时间序列分析AR定阶自回归模型(ar_select_order算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 时间序列分析中,AR定阶自回归模型(AR order selection)是指确定自回…

Vue学习之使用开发工具创建项目、gitcode管理项目

Vue学习之使用开发工具创建项目、gitcode管理项目 翻阅与学习了vue的开发工具,通过对比最终采用HBuilderX作为开发工具,以下章节对HBuilder安装与基础使用介绍 1. HBuilder 下载 从HbuildX官网(http://www.dcloud.io/hbuilderx.html&#…

制作OpenSSH 9.6 for openEuler 22.03 LTS的rpm升级包

OpenSSH作为操作系统底层管理平台软件,需要保持更新以免遭受安全攻击,编译生成rpm包是生产环境中批量升级的最佳途径。本文在国产openEuler 22.03 LTS系统上完成OpenSSH 9.6的编译工作。 一、编译环境 1、准备环境 基于vmware workstation发布的x86虚…

23种设计模式-结构型模式

1.代理模式 在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为"代理"的第三者来实现间接访问.该方案对应的设计模式被称为代理模式. 代理模式(Proxy Design Pattern ) 原始定义是:让你能够提供对象的替代品或其占位符。…

复杂链表的复制

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

电磁波的波长与频率是什么关系?

摘要: 电磁波的波长(λ)与频率(f)之间的关系可以通过以下公式来表示: f c/λ cλf 其中: c 是光速,即电磁波在真空中的传播速度,约为 3 x 10⁸ 米/秒(m/s)λ…

2024.1.26每日一题

LeetCode 边权重均等查询 2846. 边权重均等查询 - 力扣(LeetCode) 题目描述 现有一棵由 n 个节点组成的无向树,节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] [ui, vi,…

三方jar包引入到springboot中 package到jar中正常启动的pom文件怎么写 IDEA

文章目录 场景例子工程引用pom文件(打包关键)打包后观察 场景 许多时候我们在对接三方的时候,需要下载官方的推荐的SDK,但springboot项目怎么引入额外的三方jar包了,自已通过maven本地坐标的方式尝也不行,…

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024)

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024) 2024 International Conference Big Data Economy and Social Culture 一、【会议简介】 随着大数据技术的飞速发展,全球范围内对大数据经济与社会文化的研究愈发深入。为了促进国际间学术交流…

PageHelper分页插件-以三层架构模型开发为例

文章目录 1、简介2、使用2.1、导入2.1.1、SpringBoot2.1.2、非SpringBoot 2.2、controller2.3、service2.4、mapper ​🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、…

Shell中正则表达式

1.正则表达式介绍 1、正则表达式---通常用于判断语句中,用来检查某一字符串是否满足某一格式 2、正则表达式是由普通字符与元字符组成 3、普通字符包括大小写字母、数字、标点符号及一些其他符号 4、元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c…

企业级大数据安全架构(六)数据授权和审计管理

作者:楼高 本节详细介绍企业级大数据架构中的第六部分,数据授权和审计管理 1.Ranger简介 Apache Ranger是一款被设计成全面掌管Hadoop生态系统的数据安全管理框架,为Hadoop生态系统众多组件提供一个统一的数据授权和管理界面, 管…

蓝桥杯2024/1/28----十二届省赛题笔记

题目要求: 2、 竞赛板配置要求 2.1将 IAP15F2K61S2 单片机内部振荡器频率设定为 12MHz。 2.2键盘工作模式跳线 J5 配置为 KBD 键盘模式。 2.3扩展方式跳线 J13 配置为 IO 模式。 2.4 请注意 : 选手需严格按照以上要求配置竞赛板,编写和调…

APT32F1023X 发送RF433处理

1.硬件电路--CMT2110A 需要注意:发射端MCU写数据的频率要匹配,如果MCU发送中时间最小脉宽是1MS,那么它的发送需要设置为1kbps。 通过华普微USB调试工具PC软件RFPDK_V1.55查看设置是否正确。 2.RF433发送 用到的发送和接收代码来自“无线433发…

Matlab基础语法

基础语法 %% Matlab基本的小常识 % (1)在每一行的语句后面加上分号(一定要是英文的哦;中文的长这个样子;)表示不显示运行结果 a 3; a 5% (2)多行注释:选中要注释的若干语句,快捷键CtrlR % a 3; % a 5% (3)取消注释:选中要取消注释的语句,快捷键CtrlT % 我想要取…

【机器学习300问】20、什么是神经网络?和深度学习什么关系?

在学习深度学习的相关知识之前,我们首先得了解什么是神经网络,解开神经网络的神秘面纱后,什么是深度学习的问题也就迎刃而解。我依旧会采用我习惯的方式:先给出例子直观理解,在给出定义深入理解,最后在实际…