软件设计模式与体系结构-设计模式-生成模式单例模式

news2024/11/15 12:29:17

目录

  • 二、生成器模式
      • 1. 生成者模式
        • 概念
          • 实例一:房屋选购系统
            • 题目
            • 时序图
            • 类图
          • 优缺点
          • 适用场景
      • 2. 生成器模式与抽象工厂模式
      • 3. 课程作业***
  • 三、单例模式
      • 1. 单例模式
        • 要点:
        • 基本思路
          • 实例一:互联网连接问题
      • 2. 多线程情况
      • 3. 优缺点
      • 4. 适用场景
      • 5. 课程作业

二、生成器模式

1. 生成者模式

概念

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

生成器模式是一步一步创建一个复杂的对象

在这里插入图片描述

Director director = new Director();
director.setBuilder(cb);
director.construct();
if ( cb == 1 ) Product1 = director.getObject();
else Product 2 = director.getObject();

1.确定Director,成员为xxxBuilder(表示要用到的生成器的父类),方法有设置生成器,获取产品(getXXX),创建整个产品的方法(这个方法用来调用生成器的各个方法,最后生成一个完整的产品)指挥者类针对抽象生成器类编程
2.确定XXXBuilder,成员为产品,方法就是构建这个产品所有部件所需的方法,以及getXXX获取产品,以及初始化产品的方法(肯定要先new申明一个空的产品,赋值给成员变量里的产品)
3.确定具体的生成器类,继承自XXXBuilder
4.确定具体产品,成员和方法就是该产品所需的各种方法属性等

实例一:房屋选购系统
题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

时序图

在这里插入图片描述
只需要选择一个HouseBuilder,再调用构建的方法constructWholeHouse,再一个个调用生成部件的方法,调用设置参数方法,就能返回产品

类图

在这里插入图片描述

Director director = new Director();
director.setHouseBuilder( hb );
director.constructWholeHouseObj();
House hsObj = director.getHouse();
优缺点

优点

  1. 在生成器模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
  2. 每一个具体生成器都相对独立,而与其他的具体生成器无关,因此可以很方便地替换具体生成器或增加新的具体生成器,用户使用不同的具体生成器即可得到不同的产品对象
  3. 可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
  4. 增加新的具体生成器无须修改原有类库的代码,指挥者类针对抽象生成器类编程,系统扩展方便,符合“开闭原则”

缺点

  1. 生成器模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用生成器模式,因此其使用范围受到一定的限制
  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体生成器类来实现这种变化,导致系统变得很庞大
适用场景
  1. 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
  2. 需要生成的产品对象的属性相互依赖,需要指定其生成顺序
  3. 对象的创建过程独立于创建该对象的类。在生成器模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在生成器类中
  4. 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

2. 生成器模式与抽象工厂模式

  1. 与抽象工厂模式相比,生成器模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族
  2. 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在生成器模式中,客户端可以不直接调用生成器的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。
  3. 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么生成器模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车

3. 课程作业***

在这里插入图片描述
在这里插入图片描述

三、单例模式

1. 单例模式

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供一个全局访问点

要点:

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

基本思路

在这里插入图片描述

instance是静态变量,类型为Singleton,用于存储已经被创建的实例。getInstance()为实例创建方法,它创建实例的方式很特别,如果一个实例此前已经被创建了(因而被存储在变量instance中),则该方法返回instance;如果此前Single实例没有被创建,则该方法新创建并且返回Singleton类的一个实例,从而保证了实例的唯一性。

Public class Singleton {
	private static Singleton instance;
	private String name;
	private Singleton (String name) {
		this.name = name;
	}
	public static Singleton getInstance (String name) {
		if (instance == null && ! name.equals(null))
			instance = new Singleton (name);
		return instance;
	}
}
实例一:互联网连接问题

在这里插入图片描述
在这里插入图片描述

2. 多线程情况

多线程中的单例模式,在getInstance()方法应声明为synchronized,防止当唯一实例尚未创建时有两个线程同时调用创建方法,那么将导致两个现成各自创建了一个实例,从而违反了单例模式的实例唯一性的初衷

在这里插入图片描述

3. 优缺点

优点

  1. 提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它,并为设计及开发团队提供了共享的概念
  2. 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。
  3. 允许可变数目的实例。我们可以基于单例模式进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例

缺点

  1. 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难
  2. 单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起
  3. 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致对象状态的丢失

4. 适用场景

  1. 系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器,或者需要考虑资源消耗太大而只允许创建一个对象。
  2. 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。
  3. 在一个系统中要求一个类只有一个实例时才应当使用单例模式。反过来,如果一个类可以有几个实例共存,就需要对单例模式进行改进,使之成为多例模式

5. 课程作业

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


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

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

相关文章

leetcode 88.合并两个有序数组

⭐️ 题目描述 🌟 leetcode链接:合并两个有序数组 ⭕️ 代码: /*思路:双指针问题1.从前往后拷贝依次比较两个数组元素的较小值,较小值先拷贝- 问题:从前拷贝会造成覆盖(有问题)2.从后往前拷贝依次比较两个…

SpringBoot(五)SpringBoot事务

在实际开发项目时,程序并不是总会按照正常的流程去执行,有时候线上可能出现一些无法预知的问题,任何一步操作都有可能发生异常,异常则会导致后续的操作无法完成。此时由于业务逻辑并未正确的完成,所以在之前操作过数据…

单臂路由实现不同VLAN之间数据转发

实验环境: 思科模拟器,Cisco Packet Tracer 实验拓扑: 实验配置: (1)PC配置 IP地址子网掩码网关PC1192.168.10.1255.255.255.0192.168.10.254PC2192.168.10.2255.255.255.0192.168.10.254PC3192.168.20…

串口通讯监控方法

当我们调试硬件的时候,发现串口数据异常,用示波器和逻辑分析仪的话会比较麻烦,此时可以并一个监控串口,如下图所示 232串口,我们是不能直接并一个串口上去的;但是我们的监控串口,可以只接一根R…

【玩转循环】探索Python中的无限可能性

前言 循环可能是每个编程语言中使用比较多的语法了,如果能合理利用好循环,就会出现意想不到的结果,大大地减少代码量,让机器做那些简单枯燥的循环过程,今天我将为大家分享 python 中的循环语法使用。🚗&am…

数据结构--栈的链式存储

数据结构–栈的链式存储 推荐使用不带头结点的单链表 \color{green}推荐使用不带头结点的单链表 推荐使用不带头结点的单链表 typedef struct LNode {ElemType data;struct LNode* next; } LNode, *LinkList;bool InitList(LinkList &L) {L->next NULL; }后插操作&…

python网络编程(二)模拟ssh远程执行命令

1、项目需求: 要实现一个像ssh远程连接工具一样,在终端输入命令,返回对应的结果。 比如window的dos命令: dir :查看目录下的文件 ipconfig : 查看网卡信息 tasklist : 查看进程列表 linux的命令: ls : 查看…

Jenkins与CI/CD

简介 CI(持续集成) Continuous Integration是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编…

Debian 环境使用 docker compose 部署 sentry

Debian 环境使用 docker compose 部署 sentry Sentry 简介什么是 Sentry ?Sentry 开发语言及支持的 SDKSentry 功能架构 前置准备条件规格配置说明Dcoker Desktop 安装WSL2/Debian11 环境准备 Sentry 安装步骤docker 部署 sentry 步骤演示过程说明 总结 Sentry 简介…

python机器学习在气象模式订正、短临预报、气候预测等场景的应用

基于机器学习的天河机场物流预测研究 全球经济快速增长的形势下,八大区域性枢纽之一的武汉天河机场的物流需求也在攀升。文章针对天河机场的货邮吞吐量,运用机器学习中的线性回归模型通过Python对其进行需求预测,并用二次指数平滑法与之对比,在平均绝对百分误差比较下得出机器…

需求分析引言:架构漫谈(四)性能专题

前文介绍了非功能性需求里的可靠性和可用性, 本文对非功能性需求里的性能,进行一些详细的说明,和如何度量系统的性能问题。 1、概念 性能通常是指一个软件系统的处理能力和速度,一般通过 延迟 和 吞吐量 这两个指标进行度量。 不…

分布式软件架构——域名解析系统

透明多级分流系统的设计原则 用户在使用信息系统的过程中,请求首先是从浏览器出发,在DNS的指引下找到系统的入口,然后经过了网关、负载均衡器、缓存、服务集群等一系列设施,最后接触到了系统末端存储于数据库服务器中的信息&…

云计算——容器

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 一.容器简介 二.主流容器技术 1.docker (1)容器的组…

HTML5+ Runtime提示

使用的环境 vue-cli框架,Andriod调试、云打包都会出现该弹框 1.我遇到的问题 上述弹框提示,HBuilderX3.8.2 , 手机SDK版本是3.8.4,不匹配 解决目的:需要让两个版本匹配 2. 点击“查看详情”,查看原因 …

JS文件UTF8格式乱码问题

UTF8格式的JS文件在IE中显示乱码问题的解决 这种情况通常是由于JS文件头缺少BOM标志引起的,解决方式: 方法1:用系统自带记事本,另存为 UTF-8,覆盖原文件,会自动加上BOM标志(就是文件开头的EF BB BF 三个字节) 方法2: 用notepad 打开,编码菜单,由UTF8编码改为 UTF8-BOM编码

10-Vue从入门到手撕

什么时候可以开始学习Vue? 学习路线:H5 CSS3 ---> ES6 ---> 网络 ---> 第三方库 ---> 工程化 ---> Vue 不经过前面的铺垫是无法学习vue的,就算学了还得倒回去补知识点 展现Vue Vue源码分析,走进作者的内心世界 …

记录一次对STM32G4串口硬件FIFO的调试

记录一次对STM32G4串口硬件FIFO的调试 前言:通常我们使用串口接收多字节数据会使用中断和DMA两种方式。使用中断方式,每接收到一个字节就会触发一次中断,我们可以在中断函数里将接收到的这一字节保存在内存中然后等待其他程序处理&#xff0c…

麦语言是什么东东?怎么学?

麦语言(M Language)是一种用于处理数据的编程语言,最初由微软公司开发。它是Power Query(数据提取和转换工具)和Power BI(商业智能工具)中的一部分。麦语言支持对各种数据源进行查询、转换和清理…

农业温室大棚数据监控系统的设计与实现

1.引言 农业温室大棚作为现在农业发展的必要条件,将高新技术融入农业温室大棚也愈发的重要,对农业温室大棚数据的监控,将温室大棚智能化。本设计对温室大棚实现远程数据监控,自动化控制,对温室内的环境数据进行巡回检…

解决Springboot在启动时报错:不支持发行版本17

今天在创建新项目时控制台出现如下错误: 最后经过排查发现问题出现如下几点。将以下几点进行修改问题得以解决。 1.将红色箭头地方由17改为11 2.将maven的pom文件中 的javaversion由17改为113.将spingboot的版本调为2.7.5 如果以上还没有解决问题,可以尝…