设计模式之创建模式篇

设计模式是一种在软件设计中经常使用的、经过验证的解决方案,可以帮助开发者解决在设计和实现软件时常见的问题。在众多设计模式中,创建模式(Creational Patterns)是一类特别关注对象创建的模式。这些模式可以简化对象的创建过程,提高代码的灵活性和可维护性。本文将介绍几种常见的创建模式:单例模式(Singleton)、工厂模式(Factory)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。

+-------------------+-------------------+-------------------+-------------------+-------------------+
|      模式         |      单例模式     |     工厂模式      |   抽象工厂模式     |     建造者模式     |     原型模式      |
+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|      目的         | 确保一个类只有   | 提供创建对象的     | 提供创建一系列相   | 将复杂对象的构建   | 通过复制现有对象   |
|                   | 一个实例          | 接口              | 关或依赖对象的接   | 与表示分离         | 来创建新对象       |
|                   |                   |                   | 口                |                   |                   |
+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|      使用场景     | 全局配置、日志记   | 创建对象的逻辑    | 创建多个产品族的   | 构建复杂的对象,   | 创建成本较高的对   |
|                   | 录、数据库连接    | 分散在多个子类中   | 对象需要统一处理   | 且需要不同的表示   | 象,避免重复的初   |
|                   |                   |                   |                   |                   | 始化过程           |
+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|      优点         | 确保单个实例,    | 封装对象创建过   | 提高系统结构的可   | 灵活地构建复杂对   | 避免重复的初始化   |
|                   | 简化全局访问点     | 程,减少依赖       | 拓性和可维护性     | 象,提高代码的可   | 过程,提高性能       |
|                   |                   |                   |                   | 维护性和灵活性     |                   |
+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|      缺点         | 单例模式可能导   | 工厂模式需要为   | 抽象工厂模式复杂   | 建造者模式可能导   | 原型模式需要实现   |
|                   | 致全局状态的    | 每个产品类型创   | 度较高,实施困难   | 致更多的类的创   | `clone` 方法,且   |
|                   | 管理问题          | 建具体的工厂类       |                   | 建                | 依赖于具体实现       |
+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+
1. 单例模式(Singleton)

单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式在全局配置、日志记录、数据库连接等场景中非常有用。

代码示例
class Singleton:_instance = None@staticmethoddef get_instance():if Singleton._instance is None:Singleton._instance = Singleton()return Singleton._instancedef __init__(self):if Singleton._instance is not None:raise Exception("This is a singleton class. Use get_instance() to get the single instance.")self.value = None# 使用单例模式
s1 = Singleton.get_instance()
s1.value = "Singleton Value"s2 = Singleton.get_instance()
print(s2.value)  # 输出: Singleton Value

2. 工厂模式(Factory)

工厂模式提供了一种创建对象的接口,但由子类决定实例化哪个类。工厂模式将对象的创建和使用分离,提高了代码的灵活性。

代码示例
from abc import ABC, abstractmethod# 抽象产品类
class Product(ABC):@abstractmethoddef operation(self):pass# 具体产品类
class ConcreteProductA(Product):def operation(self):return "ConcreteProductA"class ConcreteProductB(Product):def operation(self):return "ConcreteProductB"# 工厂类
class Factory:def create_product(self, type):if type == "A":return ConcreteProductA()elif type == "B":return ConcreteProductB()else:raise ValueError("Invalid product type")# 使用工厂模式
factory = Factory()
product_a = factory.create_product("A")
print(product_a.operation())  # 输出: ConcreteProductAproduct_b = factory.create_product("B")
print(product_b.operation())  # 输出: ConcreteProductB

3. 抽象工厂模式(Abstract Factory)

抽象工厂模式提供了一种创建一系列相关或依赖对象的接口,而无需指定它们具体的类。这种模式适用于多个产品族(Product Families)的场合。

代码示例
from abc import ABC, abstractmethod# 抽象产品类
class AbstractProductA(ABC):@abstractmethoddef operation_a(self):passclass AbstractProductB(ABC):@abstractmethoddef operation_b(self):pass# 具体产品类
class ConcreteProductA1(AbstractProductA):def operation_a(self):return "ConcreteProductA1"class ConcreteProductA2(AbstractProductA):def operation_a(self):return "ConcreteProductA2"class ConcreteProductB1(AbstractProductB):def operation_b(self):return "ConcreteProductB1"class ConcreteProductB2(AbstractProductB):def operation_b(self):return "ConcreteProductB2"# 抽象工厂类
class AbstractFactory(ABC):@abstractmethoddef create_product_a(self):pass@abstractmethoddef create_product_b(self):pass# 具体工厂类
class ConcreteFactory1(AbstractFactory):def create_product_a(self):return ConcreteProductA1()def create_product_b(self):return ConcreteProductB1()class ConcreteFactory2(AbstractFactory):def create_product_a(self):return ConcreteProductA2()def create_product_b(self):return ConcreteProductB2()# 使用抽象工厂模式
factory1 = ConcreteFactory1()
product_a1 = factory1.create_product_a()
product_b1 = factory1.create_product_b()
print(product_a1.operation_a())  # 输出: ConcreteProductA1
print(product_b1.operation_b())  # 输出: ConcreteProductB1factory2 = ConcreteFactory2()
product_a2 = factory2.create_product_a()
product_b2 = factory2.create_product_b()
print(product_a2.operation_a())  # 输出: ConcreteProductA2
print(product_b2.operation_b())  # 输出: ConcreteProductB2

4. 建造者模式(Builder)

建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种模式适用于构建复杂对象的场合。

代码示例
from abc import ABC, abstractmethod# 复杂产品类
class Product:def __init__(self):self.parts = []def add(self, part):self.parts.append(part)def show(self):print("Product Parts:")for part in self.parts:print(part)# 抽象建造者类
class Builder(ABC):@abstractmethoddef build_part_a(self):pass@abstractmethoddef build_part_b(self):pass@abstractmethoddef get_result(self):pass# 具体建造者类
class ConcreteBuilder1(Builder):def __init__(self):self.product = Product()def build_part_a(self):self.product.add("Part A1")def build_part_b(self):self.product.add("Part B1")def get_result(self):return self.productclass ConcreteBuilder2(Builder):def __init__(self):self.product = Product()def build_part_a(self):self.product.add("Part A2")def build_part_b(self):self.product.add("Part B2")def get_result(self):return self.product# 导演类
class Director:def build(self, builder):builder.build_part_a()builder.build_part_b()# 使用建造者模式
director = Director()
builder1 = ConcreteBuilder1()
builder2 = ConcreteBuilder2()director.build(builder1)
product1 = builder1.get_result()
product1.show()
# 输出:
# Product Parts:
# Part A1
# Part B1director.build(builder2)
product2 = builder2.get_result()
product2.show()
# 输出:
# Product Parts:
# Part A2
# Part B2

5. 原型模式(Prototype)

原型模式通过复制一个现有对象来创建新对象,而不是通过调用构造函数。这种模式适用于创建成本较高的对象,并且希望避免重复的初始化过程。

代码示例
import copy# 原型类
class Prototype:def clone(self):pass# 具体原型类
class ConcretePrototype1(Prototype):def __init__(self, name):self.name = namedef clone(self):return copy.deepcopy(self)def __str__(self):return f"ConcretePrototype1: {self.name}"class ConcretePrototype2(Prototype):def __init__(self, name):self.name = namedef clone(self):return copy.deepcopy(self)def __str__(self):return f"ConcretePrototype2: {self.name}"# 使用原型模式
prototype1 = ConcretePrototype1("Prototype1")
new_prototype1 = prototype1.clone()
print(new_prototype1)  # 输出: ConcretePrototype1: Prototype1prototype2 = ConcretePrototype2("Prototype2")
new_prototype2 = prototype2.clone()
print(new_prototype2)  # 输出: ConcretePrototype2: Prototype2

总结

创建模式是设计模式中的一种重要类型,它们关注对象的创建过程,提供了一种更灵活、可维护的方式来创建对象。通过使用单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式,我们可以有效地解决在对象创建过程中遇到的多种问题,提高代码的质量和可扩展性。

  • 单例模式:确保一个类只有一个实例,并提供一个全局访问点。
  • 工厂模式:提供创建对象的接口,由子类决定实例化哪个类。
  • 抽象工厂模式:提供创建一系列相关或依赖对象的接口,无需指定具体类。
  • 建造者模式:将复杂对象的构建与表示分离,使同样的构建过程可以创建不同的表示。
  • 原型模式:通过复制现有对象来创建新对象,避免重复的初始化过程。

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

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

相关文章

游戏陪玩系统开发功能需求分析

电竞游戏陪玩系统是一种专门为游戏玩家提供陪伴、指导和互动服务的平台。这类系统通常通过专业的陪玩师(也称为陪练师)为玩家提供一对一或多对一的游戏陪伴服务,帮助玩家提升游戏技能、享受游戏乐趣,甚至解决游戏中的各种问题。电…

【数据库入门】关系型数据库入门及SQL语句的编写

1.数据库的类型: 数据库分为网状数据库,层次数据库,关系型数据库和非关系型数据库四种。 目前市场上比较主流的是:关系型数据库和非关系型数据库。 关系型数据库使用结构化查询语句(SQL)对关系型数据库进行…

【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析

第一个问题是:请基于附件 1 中的数据以及你的团队收集的额外数据,分析过去五年中国宠物行业按宠物类型的发展情况。并分析中国宠物行业发展的因素,预测未来三年中国宠物行业的发展。 第一个问题:分析中国宠物行业按宠物类型的发展…

合法三元数量计算

问题描述 小C、小U 和小R 三个好朋友喜欢做一些数字谜题。这次他们遇到一个问题&#xff0c;给定一个长度为n的数组a&#xff0c;他们想要找出符合特定条件的三元组 (i, j, k)。具体来说&#xff0c;三元组要满足 0 < i < j < k < n&#xff0c;并且 max(a[i], a[…

wsl虚拟机中的dockers容器访问不了物理主机

1 首先保证wsl虚拟机能够访问宿主机IP地址&#xff0c;wsl虚拟机通过vEthernet (WSL)的地址访问&#xff0c;着意味着容器也要通过此IP地址访问物理主机。 2 遇到的问题&#xff1a;wsl虚拟机中安装了docker&#xff0c;用在用到docker容器内的开发环境&#xff0c;但是虚拟机…

深入了解 Linux htop 命令:功能、用法与示例

文章目录 深入了解 Linux htop 命令&#xff1a;功能、用法与示例什么是 htop&#xff1f;htop 的安装htop的基本功能A区&#xff1a;系统资源使用情况B区&#xff1a;系统概览信息C区&#xff1a;进程列表D区&#xff1a;功能键快捷方式 与 top 的对比常见用法与示例实际场景应…

如何删除Kafka中的数据以及删除topic

如何删除Kafka数据已经以及删除topic呢&#xff1f; 1、删除数据 先启动Kafka实例 docker exec -it kafka-0 /bin/bash #进去容器 rm -rf /bitnami/kafka/data/* #删除数据 exit #退出如果删除失败&#xff0c;可能是数据不存在于/bitnami/kafka/data&#xff0c;使用 cd /o…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09; 文件导出 获取 resources 目录下的文件&#xff0c;使用 withTemplate 获…

【2024最新】基于springboot+vue的疫情网课管理系统lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

贴代码框架PasteForm特性介绍之image

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画

Python Turtle召唤童年&#xff1a;喜羊羊与灰太狼之懒羊羊绘画 &#x1f438; 前言 &#x1f438;&#x1f41e;往期绘画&#x1f41e;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f438; 前言 &#x1f438; 小时候&#xff0c;每次打开电视…

SpringBoot学习记录(四)之分页查询

SpringBoot学习记录&#xff08;四&#xff09;之分页查询 一、业务需求1、基本信息2、请求参数3、相应数据 二、传统方式分页三、使用PageHelper分页插件 一、业务需求 根据条件进行员工数据的条件分页查询 1、基本信息 请求路径&#xff1a; /emps 请求方式&#xff1a; …

6. Spring Cloud Gateway网关超详细内容配置解析说明

6. Spring Cloud Gateway网关超详细内容配置解析说明 文章目录 6. Spring Cloud Gateway网关超详细内容配置解析说明前言1 Spring Cloud Gateway 概述1.1 Spring Cloud Gateway网关 的核心功能1.2 Spring Cloud Gateway VS Zuul 的区别1.3 Spring Cloud Gateway 的基本原理1.4 …

远程管理不再难!树莓派5安装Raspberry Pi OS并实现使用VNC异地连接

前言&#xff1a;大家好&#xff01;今天我要教你们如何在树莓派5上安装Raspberry Pi OS&#xff0c;并配置SSH和VNC权限。通过这些步骤&#xff0c;你将能够在Windows电脑上使用VNC Viewer&#xff0c;结合Cpolar内网穿透工具&#xff0c;实现长期的公网远程访问管理本地树莓派…

Centos 8, add repo

Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han

【机器学习】回归模型(线性回归+逻辑回归)原理详解

线性回归 Linear Regression 1 概述 线性回归类似高中的线性规划题目。线性回归要做的是就是找到一个数学公式能相对较完美地把所有自变量组合&#xff08;加减乘除&#xff09;起来&#xff0c;得到的结果和目标接近。 线性回归分为一元线性回归和多元线性回归。 2 一元线…

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域

量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力&#xff0c;远远超过了经典计算机的能力。当与人工智能&#xff08;AI&#xff09;集成时&#xff0c;量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题&#xff0c;这对优化和…

STM32F103 GPIO和串口实战

本节我们将会对STM32F103的硬件资源GPIO和串口进行介绍。 一、GPIO 1.1 电路原理图 LED电路原理图如下图所示&#xff1a; 其中&#xff1a; LED1连接到PA8引脚&#xff0c;低电平点亮&#xff1b;LED2连接到PD2引脚&#xff0c;低电平点亮&#xff1b; 1.2 GPIO引脚介绍 STM32…

FileProvider高版本使用,跨进程传输文件

高版本的android对文件权限的管控抓的很严格,理论上两个应用之间的文件传递现在都应该是用FileProvider去实现,这篇博客来一起了解下它的实现原理。 首先我们要明确一点,FileProvider就是一个ContentProvider,所以需要在AndroidManifest.xml里面对它进行声明: <provideran…