当前位置: 首页 > news >正文

设计模式-创建型模式(单例、工厂、建造、原型)

Concept-概念前置

设计模式:软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。

面向对象三大特性:封装、继承、多态。

面向对象设计的SOLID原则:
(1)开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

(2)里氏替换原则:所有引用父类的地方必须能透明地使用其子类的对象。

(3)依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象; 抽象不应该依赖细节;细节应该依赖抽象。

(4)接囗隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
(5)单一职责原则:不要存在多于一个导致类变更的原因,即一个类只负责一项职责。
 

举个例子,可能有不止一块代码调用到该实体,这时候去修改实体里的代码,就很可能引起其他模块会出现问题,当模块关联较多时就会引起不必要的工作量,这是1;

原方法支持父类,当我们在基础上加或修改功能而衍生的子类也应当符合,这是2;

要针对接口编程, 而不是针对实现编程,实现上也就是对底层的依赖按接口格式去写,再实现,而不是随意修改参数格式,即3。

创建型模式

简单工厂模式,工厂方法模式,抽象工厂模式,创建者模式,原型模式,单例模式。

创建型模式(Creational Pattern)一种用于 创建对象 的设计模式。它们包含一些通用的方法,更加灵活地创建对象,且 封装 了对象的实例化过程
工厂模式(Factory Pattern)

用于根据 客户端需求动态创建 对象。

(包括简单工厂模式,工厂方法模式,抽象工厂模式)

单例模式(Singleton Pattern)

用于确保一个类 只有一个 实例,并提供对该实例的全局访问点。它通常被用于管理共享资源或者限制系统中某些类的实例数量。

建造者模式(Builder Pattern)

用于将一个复杂对象的 构建过程分离 成多个简单的步骤,从而可以灵活地组合和构建不同的对象。它通常被用于创建复杂的对象,比如包含多个组件或者配置项的对象。

原型模式(Prototype Pattern)用于 复制或克隆 已有的对象,从而创建新的对象。它通过克隆现有对象来创建新对象,从而避免了昂贵的初始化操作。

工厂模式

Factory Pattern

简单工厂模式(Simple Factory Pattern):简单工厂模式是一种基本的工厂模式,通常由一个工厂类根据传入的参数动态决定创建哪种产品类的实例。(简单而言:一个工厂类根据传入参数创建哪个类实例)场景:适用于对象较少且产品等级结构稳定的情况。 Characters: 工厂角色(Factory) 抽象产品角色(Product) 具体产品角色(Concrete Product)
class Product:def use(self):passclass ConcreteProductA(Product):def use(self):print("Using product A.")class ConcreteProductB(Product):def use(self):print("Using product B.")class Factory:@staticmethoddef create_product(product_type):if product_type == "A":return ConcreteProductA()elif product_type == "B":return ConcreteProductB()product_a = Factory.create_product("A")
product_a.use()   # 输出:Using product A.product_b = Factory.create_product("B")
product_b.use()   # 输出:Using product B.
工厂方法模式(Factory Method Pattern):将实际创建对象的工作推迟到子类中完成。可以在不修改工厂类的情况下,增加新的产品系列和产品等级结构。(简单而言:工厂类抽象化,将增改操作下发给子类)场景: 工厂方法模式适用于对象数量较多且产品等级结构较为复杂的情况。Characters: 工厂角色(Factory) 具体工厂角色(Concrete Factory) 抽象产品角色(Product) 具体产品角色(Concrete Product)
class Product:def use(self):passclass ConcreteProductA(Product):def use(self):print("Using product A.")class ConcreteProductB(Product):def use(self):print("Using product B.")class Factory:def create_product(self):passclass ConcreteFactoryA(Factory):def create_product(self):return ConcreteProductA()class ConcreteFactoryB(Factory):def create_product(self):return ConcreteProductB()factory_a = ConcreteFactoryA()
product_a = factory_a.create_product()
product_a.use()  # 输出:Using product A.factory_b = ConcreteFactoryB()
product_b = factory_b.create_product()
product_b.use()  # 输出:Using product B.

抽象工厂模式(Abstract Factory Pattern):是一种将工厂类进行抽象化的进一步改进,它使用了对象组合的方式来构建不同的产品族。(工厂抽象化,组合各种产品,有点像工厂方法模式的不同类方法组合)

场景: 抽象工厂模式可以同时创建多个不同的产品,且这些产品之间存在着一定的关联性。

Characters: 工厂角色(Factory) 具体工厂角色(Concrete Factory) 抽象产品角色(Product) 具体产品角色(Concrete Product) 客户端(Client)

class ProductA:def use(self):passclass ConcreteProductA1(ProductA):def use(self):print("Using product A1.")class ConcreteProductA2(ProductA):def use(self):print("Using product A2.")class ProductB:def operate(self):passclass ConcreteProductB1(ProductB):def operate(self):print("Operating product B1.")class ConcreteProductB2(ProductB):def operate(self):print("Operating product B2.")class Factory:def create_product_a(self):passdef create_product_b(self):passclass ConcreteFactory1(Factory):def create_product_a(self):return ConcreteProductA1()def create_product_b(self):return ConcreteProductB1()class ConcreteFactory2(Factory):def create_product_a(self):return ConcreteProductA2()def create_product_b(self):return ConcreteProductB2()factory_1 = ConcreteFactory1()
product_a1 = factory_1.create_product_a()
product_a1.use()  # 输出:Using product A1.
product_b1 = factory_1.create_product_b()
product_b1.operate()  # 输出:Operating product B1.factory_2 = ConcreteFactory2()
product_a2 = factory_2.create_product_a()
product_a2.use()  # 输出:Using product A2.
product_b2 = factory_2.create_product_b()
product_b2.operate()  # 输出:Operating product B2.


单例模式

Singleton Pattern

保证一个类仅有一个实例,并提供访问该实例的全局访问点。
class Singleton:__instance = Nonedef __new__(cls):if cls.__instance is None:cls.__instance = object.__new__(cls)return cls.__instances1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # 输出:True =》 说明唯一性

建造者模式

Builder Pattern

将一个复杂对象的构建过程分离成多个简单的步骤
场景: 灵活地组合和构建不同的对象。Characters:产品类(Product) 抽象建造者类(Builder)具体建造者类(ConcreteBuilder) 指挥者类(Director)
class Product:def __init__(self):self.part_a = Noneself.part_b = Noneclass Builder:def build_part_a(self):passdef build_part_b(self):passdef get_result(self):passclass ConcreteBuilder1(Builder):def __init__(self):self.product = Product()def build_part_a(self):self.product.part_a = "Part A1"def build_part_b(self):self.product.part_b = "Part B1"def get_result(self):return self.productclass ConcreteBuilder2(Builder):def __init__(self):self.product = Product()def build_part_a(self):self.product.part_a = "Part A2"def build_part_b(self):self.product.part_b = "Part B2"def get_result(self):return self.productclass Director:def __init__(self, builder):self.builder = builderdef construct(self):self.builder.build_part_a()self.builder.build_part_b()return self.builder.get_result()builder_1 = ConcreteBuilder1()
director_1 = Director(builder_1)
product_1 = director_1.construct()
print(f"Product 1: {product_1.part_a}, {product_1.part_b}")  # 输出:Product 1: Part A1, Part B1builder_2 = ConcreteBuilder2()
director_2 = Director(builder_2)
product_2 = director_2.construct()
print(f"Product 2: {product_2.part_a}, {product_2.part_b}")  # 输出:Product 2: Part A2, Part B2

原型模式

Prototype Pattern

允许通过复制现有对象来创建新的对象,而无需重新实例化。Think: 定义一个抽象原型类,包含了用于复制自身的抽象方法 clone()。然后,定义具体的原型类。在客户端代码中,可以通过调用具体对象 clone() 方法来创建新的对象,而无需重新实例化。(注意深浅拷贝问题)
import copyclass Prototype:def clone(self):return copy.deepcopy(self)class ConcretePrototype1(Prototype):def __init__(self, attr):self.attr = attrclass ConcretePrototype2(Prototype):def __init__(self, attr):self.attr = attrif __name__ == '__main__':prototype_1 = ConcretePrototype1("attr_1")prototype_2 = ConcretePrototype2("attr_2")clone_1 = prototype_1.clone()clone_2 = prototype_2.clone()print(f"Original: ({prototype_1.attr}, {prototype_2.attr})")  # 输出:Original: (attr_1, attr_2)print(f"Clone: ({clone_1.attr}, {clone_2.attr})")  # 输出:Clone: (attr_1, attr_2)

相关文章:

设计模式-创建型模式(单例、工厂、建造、原型)

Concept-概念前置 设计模式:软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。 面向对象三大特性:封装、继承、多态。 面向对象设计的SOLID原则: (1)开放封闭原则&#…...

用饭店来形象比喻线程池的工作原理

一、线程池解决的问题? 使用线程池主要解决在程序中频繁创建和销毁线程导致的资源浪费,线程池可以维护一定量的线程来执行所需要的任务,维护的线程也可以重复使用。 二、用形象的饭店来解释工作原理 线程池就相当于一家饭店, 任…...

GO学习笔记之表达式

GO学习笔记之表达式 保留字运算符优先级二元运算符位运算符自增指针 保留字 Go语言仅25个保留关键字(keyword),这是最常见的宣传语,虽不是主流语言中最少的,但也确实体现了Go语法规则的简洁性。保留关键字不能用作常量…...

005Mybatis返回值(ResultMap 一对多,多对多)

属性 id 应该总是指定一个或多个可以唯一标识结果的属性。 虽然,即使不指定这个属性,MyBatis 仍然可以工作,但是会产生严重的性能问题。 只需要指定可以唯一标识结果的最少属性。显然,你可以选择主键(复合主键也可以…...

把玩数据在内存中的存储

前言:时光如梭💦,今天到了C语言进阶啦😎,基础知识我们已经有了初步认识, 是时候该拔高拔高自己了😼。 目标:掌握浮点数在内存的存储,整形在内存的存储。 鸡汤&#xff1a…...

Nginx运行原理与基本配置文件讲解

文章目录 Nginx基本运行原理Nginx的基本配置文件serverlocationroot 与 alias 的区别server 和 location 中的 rootnginx欢迎页 本文参考文章Nginx相关文章 Nginx基本运行原理 Nginx的进程是使用经典的「Master-Worker」模型,Nginx在启动后,会有一个master进程和多个…...

openGauss5 企业版之SQL语法和数据结构

文章目录 1.openGauss SQL 语法2. 数据类型2.1数值类型2.2 布尔类型2.3 字符类型2.4 二进制类型2.5日期/时间类型2.6 几何类型2.7 网络地址类型2.8 位串类型2.9 文本搜索类型2.10 UUID数据类型2.11 JSON/JSONB类型2.11 HLL数据类型2.12 范围类型2.13 索引2.14 对象标识符类型2.…...

TClientDataSet 模拟 EXCEL表

日常处理数据时,经常需要,从EXCEL表格中,批量导入数据,通过 XLSReadWriteII编程,会很快导入。 但是,客户提供的EXCEL表的字段,数据格式,字段的排序,有很大的区别。因此&a…...

Hazel游戏引擎(012)GLFW窗口事件

文中若有代码、术语等错误,欢迎指正 文章目录 前言如何确定GLFW窗口事件的回调函数参数Application接收事件回调流程原项目流程(12345)自己写的简单Demo与流程(123) 前言 此节目的 为了完成008计划窗口事件的接收glfw窗口事件以及回调部分 此节要完成 使用glfw函数…...

Nenu算法复习第六章

目录 补充知识点 1160: 6001 第几天? 1161: 6002 时间格式转换 1162: 6003 星期几? 1163: 6004 18岁生日、 补充知识点 闰年的判断方法: 能被四整除但是不能一百整除或者能被400整除 例题: 题目描述 经常会有人问你怎么判断闰年&…...

知识付费社群:最好的知识传播方式

知识付费是一种网络内容付费方式,它让知识传播者通过网络以付费的方式向社会大众或特定平台传递知识、技能和智力资源。 知识付费传播的成功离不开用户,他们是核心节点,也是受众和粉丝的重要组成部分。用户不仅可以生产和传播知识&#xff0…...

局域网内不同网段的设备互相连接设置

目录 介绍1、打开网络连接,找到本地网络->属性->ipv4->属性->高级:2、在高级设置页面,我们添加一个IP,这个IP和板子在一个网段,我这里设置的是192.168.253.101:3、设置完成即可生效&#xff0c…...

LVS+Keepalived 群集

目录 一、keepalived概述 1.keepalived工作原理 2.keepalived体系主要模块及其作用 3.判断服务器主备,及如何配置浮动IP 二、keepalived的抢占与非抢占模式 三、部署LVSkeepalived 1.配置负载调度器(主备相同) 1.1配置keepalived&…...

windows系统cmd命令设置别名,并添加到环境变量

众所周知,Linux 命令很强大,使用起来也很方便,但是想在 windows 系统上使用 Linux 命令有些困难,要么下载第三方终端工具,要么就是安装一系列命令环境。 作为一个前端开发,其实可以全局安装一下 npm 命令行…...

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机) 目录 智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 Matlab实现GWO-SVM灰狼算法优化支持向量机的多输…...

java方法

文章目录 一、java方法总结 一、java方法 在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢? println() 是一个方法。 System 是系统类。 out 是标准输出对象。这句话的用法是调用系统类 System 中的标准输出对象 out 中的方法 pr…...

LabVIEW与Space Wire配合开发

LabVIEW与Space Wire配合开发 Space Wire是欧洲航天局开发的一种高速、点对点、全双工的串行总线网络,以IEEE1355-1995和LVDS 两个商业标准为基础,汲取了1394技术、ATM技术、以太网技术的优点,同时考虑了空间应用的特点,在故障检…...

开始使用chat-gpt4

目录 一、说明 二、安装步骤 三、测试效果咋样 (1)写代码能力 (2)回答问题能力 (3)写作能力 一、说明 参考(非常感谢这位博主的分享):http://t.csdn.cn/qypw9 注意&…...

算法之贪心算法

定义 总是做出当前最好的选择,期望通过局部最优选择得到全局最优的解决方案。 适用标准 贪心选择性质。 原问题的整体最优解可以通过一系列局部最优的选择得到。这种选择依赖于已做出的选择,不依赖于未做出的选择。贪心算法解决的问题,在程…...

Maven 基础

博文目录 文章目录 Maven基础概念生命周期 - Build Lifecycle阶段 - Build Phase目标 - Plugin goals默认目标绑定Clean 生命周期Default 生命周期Site 生命周期 插件 - Plugin POM(Project Object Model)Super POM项目继承 - Project Inheritance项目聚…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

AspectJ 在 Android 中的完整使用指南

一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

2025季度云服务器排行榜

在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

Python学习(8) ----- Python的类与对象

Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...