[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.hqwc.cn/news/439218.html

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

相关文章

线程锁多线程的复习

线程 实现方式3种乐观锁&悲观锁线程池线程池总结 进程:是正在运行的程序 线程:是进程中的单个顺序控制流,是一条执行路径 实现方式3种 1.Thread //步骤一:定义一个继承Thread的类 //步骤二:再定义的类中重写run()方法 //步骤三:创建定义类对象 //步骤四:启动线程 class M…

【Spring实战】32 Spring Boot3 集成 Nacos 服务注册中心 并在 Gateway 网关中应用

文章目录 1. 定义2. 背景3. 功能和特性4. 下载安装5. 服务启动6. 使用示例1)服务提供者2)服务消费者3)测试 7. 代码参考结语 1. 定义 Nacos 是 Dynamic Naming and Configuration Service 的首字母简称,一个更易于构建云原生应用…

最后50个CC龙年红包封面,免费速领!还有更多......高中生也卷起Steam来了

微信视频号之前是送了我3张新年红包封面,一共是150个,但不太会操作浪费了100个,只能我自己用来送老铁了。 晓衡又做了一条 Cocos 小可爱 CC 封面红包,特别适合送女生或给小朋友们,点击视频领取!还好微信又送…

防火墙知识普及详解,使用TOR Router把TOR作为默认网关,增加隐私/匿名性

防火墙知识普及详解,使用TOR Router把TOR作为默认网关,增加隐私/匿名性。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶意使用该工具造成的损失,和本人及开发者…

嵌入式学习 Day13

一. 指针总结 1.指针概念 a.指针 --- 地址 ---内存单元编号 b.指针 --- 数据类型 ---指针类型 不同语境: 定义一个指针 //指针类型的变量 打印某个变量的指针 //指针 --地址 2.指针变量的定义 基类型 * 变量名 a.基类型 …

Pytest中doctests的测试方法应用

在 Python 的测试生态中,Pytest 提供了多种灵活且强大的测试工具。其中,doctests 是一种独特而直观的测试方法,通过直接从文档注释中提取和执行测试用例,确保代码示例的正确性。本文将深入介绍 Pytest 中 doctests 的测试方法,包括基本用法和实际案例,以帮助你更好地利用…

python3.8 安装缺少ssl、_ctypes模块解决办法

问题 安装pyhton3.8安装默认不依赖ssl 运行Flask项目时报错&#xff1a; Traceback (most recent call last):File "/usr/local/python3/bin/flask", line 8, in <module>sys.exit(main())File "/usr/local/python3/lib/python3.8/site-packages/flask…

TensorFlow2实战-系列教程9:RNN文本分类1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、文本分类任务 1.1 文本分类 数据集构建&#xff1a;影评数据集进行情感分析&…

[C++历练之路]C++中的继承小学问

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; C中&#xff0c;继承是一种面向对象编程的重要概念&#xff0c;它允许一个类&#xff08;子类/派生类&#xff09;从另一个类&#xff08;父类/基类&#xff09;继承属性和方法。继承是…

python统计分析——样本方差的分布

参考资料&#xff1a;用python动手学统计学 1、导入库 import numpy as np import pandas as pd import scipy as sp from scipy import statsfrom matplotlib import pyplot as plt import seaborn as sns 2、数据准备 建立一个平均数为4&#xff0c;标准差为0.8的正态分布…

ctfshow web72

下载源码&#xff1a; 开启环境&#xff1a; 本题设置了 open_basedir()&#xff0c;将php所能打开的文件限制在指定的目录树中&#xff0c;包括文件本身。 因为 ini_set() 也被限制了&#xff0c;所以 open_basedir() 不能用 ini_set() 重新设置绕过。 使用 php 伪协议 glob:…

前端框架---Vue2学习教程(上)

从HTML到现在一路跟过来的小伙伴们&#xff0c;坚持固然不容易&#xff0c;但我相信大家已经学到了不少&#xff0c;那么我们开始马不停蹄的进入前端的框架吧&#xff0c;下面讲的是Vue2&#xff0c;大家继续加油鸭&#xff01;&#xff01;&#xff01;&#xff01; Vue2 Vu…