设计模式之创建模式篇

news2024/11/23 12:57:10

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

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

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

代码示例
class Singleton:
    _instance = None

    @staticmethod
    def get_instance():
        if Singleton._instance is None:
            Singleton._instance = Singleton()
        return Singleton._instance

    def __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):
    @abstractmethod
    def 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())  # 输出: ConcreteProductA

product_b = factory.create_product("B")
print(product_b.operation())  # 输出: ConcreteProductB

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

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

代码示例
from abc import ABC, abstractmethod

# 抽象产品类
class AbstractProductA(ABC):
    @abstractmethod
    def operation_a(self):
        pass

class AbstractProductB(ABC):
    @abstractmethod
    def 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):
    @abstractmethod
    def create_product_a(self):
        pass

    @abstractmethod
    def 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())  # 输出: ConcreteProductB1

factory2 = 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):
    @abstractmethod
    def build_part_a(self):
        pass

    @abstractmethod
    def build_part_b(self):
        pass

    @abstractmethod
    def 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.product

class 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 B1

director.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 = name

    def clone(self):
        return copy.deepcopy(self)

    def __str__(self):
        return f"ConcretePrototype1: {self.name}"

class ConcretePrototype2(Prototype):
    def __init__(self, name):
        self.name = name

    def 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: Prototype1

prototype2 = ConcretePrototype2("Prototype2")
new_prototype2 = prototype2.clone()
print(new_prototype2)  # 输出: ConcretePrototype2: Prototype2

总结

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

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

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

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

相关文章

大疆上云api开发

目前很多公司希望使用上云api开发自己的无人机平台,但是官网资料不是特别全,下面浅谈一下本人开发过程中遇到的一系列问题。 本人使用机场为大疆机场2,飞机为M3TD,纯内网使用 部署 链接: 上云api代码. 首先从github上面拉去代码 上云api代码github. 后…

实现管易云到金蝶云星空的数据无缝集成

管易云数据集成到金蝶云星空:案例分享 在企业信息化系统中,数据的高效流动和准确对接是业务顺利运行的关键。本文将聚焦于一个具体的系统对接集成案例——通过轻易云数据集成平台实现管易云数据到金蝶云星空的无缝迁移,方案名称为“wk_店铺_…

Ubuntu上安装MySQL并且实现远程登录

目录 下载网络工具 查看网络连接 更新系统软件包; 安装mysql数据库 查看mysql数据库状态 以数字ip形式显示mysql的监听状态。(默认监听端口是3306) 查看安装mysql数据库时系统创建的目录信息。 根据查询到的系统用户名以及随机密码&a…

卷积神经网络各层介绍

目录 1 卷积层 2 BN层 3 激活层 3.1 ReLU(Rectified Linear Unit) 3.2 sigmoid 3.3 tanh(双曲正切) 3.4 Softmax 4 池化层 5 全连接层 6 模型例子 1 卷积层 卷积是使用一个卷积核(滤波器)对矩阵进…

LVS

一、 lvs简介 LVS:Linux Virtual Server ,负载调度器,内核集成,章文嵩,阿里的四层 SLB(Server LoadBalance) 是基 于 LVSkeepalived 实现 LVS 官网 : http://www.linuxvirtualserver.org/ LVS 相关术语 VS: Virtual Serve…

使用 Elastic AI Assistant for Search 和 Azure OpenAI 实现从 0 到 60 的转变

作者:来自 Elastic Greg Crist Elasticsearch 推出了一项新功能:Elastic AI Assistant for Search。你可以将其视为 Elasticsearch 和 Kibana 开发人员的内置指南,旨在回答问题、引导你了解功能并让你的生活更轻松。在 Microsoft AI Services…

掺铒光纤激光器

一、光纤激光器的特点 实现灵活的激光光源(窄线宽、可调谐、多波长、超短光脉冲源)易获得高功率、高的光脉冲能量激光波长与光纤通信传输窗口相匹配采用激光器泵浦形式(半导体激光器泵浦)热稳定性、价格低廉、易小型化 二、放大…

AP+AC组网——STA接入

扫描 主动扫描:STA发送Probe Request帧,AP收到回复Probe Response 可以带着SSID扫描寻找指定WIFI,也可以带着空SSID扫描进入周围可用WLAN 被动扫描: 客户端通过侦听AP定期发送的Beacon帧(100TUs,1TU1024…

基于 ESP-AT (v3.x)固件通过 AT+SYSMFG 指令更新证书设置

AT 固件里的证书文件通过 mfg_nvs.csv 文件管理,所有证书都是写入 mfg_nvs 分区。可以先查看 mfg_nvs.csv 文件的内容来确定有哪些证书文件被管理,如下: 通过 AT 指令更新证书的方式如下: // 获取证书类型 ATSYSMFG?/…

投资策略规划最优决策分析

目录 一、投资策略规划问题详细 二、存在最优投资策略:每年都将所有钱投入到单一投资产品中 (一)状态转移方程 (二)初始条件与最优策略 (三)证明最优策略总是将所有钱投入到单一投资产品中…

android 性能分析工具(03)Android Studio Profiler及常见性能图表解读

说明:主要解读Android Studio Profiler 和 常见性能图表。 Android Studio的Profiler工具是一套功能强大的性能分析工具集,它可以帮助开发者实时监控和分析应用的性能,包括CPU使用率、内存使用、网络活动和能耗等多个方面。以下是对Android …

(UI自动化测试)web自动化测试

web自动化测试 UI自动化测试介绍 自动化测试理论: 图片上的文字等等不能做测试,只能发现固定的bug 工具选择及介绍 浏览器驱动:找元素--核心:驱动(操作元素)--通过代码

Web3与智能合约:区块链技术下的数字信任体系

随着互联网的不断发展,Web3代表着我们迈入了一个去中心化、更加安全和智能的网络时代。作为Web3的核心组成部分,区块链技术为智能合约的出现和发展提供了强有力的基础。智能合约不仅仅是自动化的代码,它们正逐步成为重塑数字世界信任体系的关…

AUTOSAR_EXP_ARAComAPI的7章笔记(6)

☞返回总目录 相关总结:ara::com 与 AUTOSAR 元模型的关系总结 7.4 ara::com 与 AUTOSAR 元模型的关系 在本文档中,我们一直在不涉及具体的AP元模型(其清单部分)的情况下解释 ara::com API的思想和机制,AP元模型是正…

浦语提示词工程实践(LangGPT版,服务器上部署internlm2-chat-1_8b,踩坑很多才完成的详细教程,)

首先,在InternStudio平台上创建开发机。 创建成功后点击进入开发机打开WebIDE。进入后在WebIDE的左上角有三个logo,依次表示JupyterLab、Terminal和Code Server,我们使用Terminal就行。(JupyterLab可以直接看文件夹)…

webgl threejs 云渲染(服务器渲染、后端渲染)解决方案

云渲染和流式传输共享三维模型场景 1、本地无需高端GPU设备即可提供三维项目渲染 云渲染和云流化媒体都可以让3D模型共享变得简单便捷。配备强大GPU的远程服务器早就可以处理密集的处理工作,而专有应用程序,用户也可以从任何个人设备查看全保真模型并与…

统信桌面操作系统V20专业版安装指南

1.概述 统信桌面操作系统安装器用于完成系统安装的任务,本手册会介绍统信UOS的安装环境、配置要求、安装方法,以及系统初始化设置,希望用户根据本文档可以快速高效的完成系统安装。 1.1安装配置要求 您安装系统前需了解安装统信桌面操作系…

16. 指针类型和步长概念问题

1. 项目场景: ➣ Jack Qiao对米粒说:“今天有道友遇到一个问题,举个栗子数组 arr[5] { 0 };道友发现&arr[0] 1与&arr 1打印出来的地址竟然不同。”米粒测试后果然是这样。 2. 问题描述 ☑ 举个栗子:数组 arr[5] { 0…

设计模式-创建型-抽象工厂模式

1.概念 工厂方法模式只能生产一个产品系列,抽象工厂可以生产多个产品系列 2.作用 多个具体产品组成一个产品族(产品系列),一个具体工厂负责生产一个产品族 3.应用场景 系统所需产品间由依赖关系,可以划分为同一产…

20241121 android中树结构列表(使用recyclerView实现)

1、adapter-item的布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wrap_content&…