【Python笔记-设计模式】原型模式

一、说明

原型模式是一种创建型设计模式, 用于创建重复的对象,同时又能保证性能。

使一个原型实例指定了要创建的对象的种类,并且通过拷贝这个原型来创建新的对象。

(一) 解决问题

主要解决了对象的创建与复制过程中的性能问题。主要针对:复杂对象相识对象的创建

在某些情况下,直接使用new关键字或者其他方式创建对象可能会导致性能损耗较大,特别是当对象的创建过程比较复杂或者耗时时。

(二) 使用场景

  • 类初始化时需要消耗大量资源,如数据、硬件资源等。通过原型拷贝可以避免这些消耗,提高资源利用率。
  • 创建对象时需要繁琐的数据准备或访问权限。原型模式可以简化对象的创建过程,提高性能。
  • 一个对象需要提供给其他对象访问,并且各个调用者可能需要修改其值。通过保护性拷贝,可以创建多个对象供调用者使用,同时保持原对象的状态不变。

二、结构

  1. 原型(Prototype):接口将对克隆方法进行声明。在绝大多数情况下,其中只会有一个名为clone克隆的方法。
  2. 具体原型(Concrete Prototype):类将实现克隆方法。除了将原始对象的数据复制到克隆体中之外,该方法有时还需处理克隆过程中的极端情况,例如克隆关联对象和梳理递归依赖等等。
  3. 客户端(Client):可以复制实现了原型接口的任何对象。

三、伪代码

python 复制代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

例:通过原型实例克隆多个人的对象,并更新其属性
"""

import copy


class Prototype:
    def __init__(self):
        self._objs = {}

    def register_object(self, key, obj):
        self._objs[key] = obj

    def unregister_object(self, key):
        del self._objs[key]

    def clone(self, key, **attrs):
        obj = copy.deepcopy(self._objs[key])
        obj.__dict__.update(attrs)
        return obj


class People:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

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


if __name__ == '__main__':
    """
    Original: {'name': '张三', 'age': 20}
    Clone: {'name': '李四', 'age': 24}
    """
    # 创建原型对象
    prototype = Prototype()
    # 创建一个 People 实例并注册为原型对象
    people = People(name="张三", age=20)
    prototype.register_object("people", people)
    # 克隆一个 People 实例
    people_clone = prototype.clone("people", name="李四", age=24)

    # 输出原型对象和克隆对象
    print("Original:", people)
    print("Clone:", people_clone)

四、优缺点

优点

  • 性能提升:通过复用已有对象,避免了重复的对象创建和初始化过程,从而提高了性能。
  • 简化创建过程:客户端代码无需知道对象创建的细节,只需要调用克隆方法即可。

缺点

  • 复杂度增加:需要实现克隆方法
  • 深拷贝和浅拷贝问题:在实现克隆方法时,需要考虑深拷贝和浅拷贝的问题。浅拷贝只复制对象本身和其中的基本数据类型,而深拷贝会复制对象及其引用的所有对象。如果处理不当,可能会导致对象之间的意外关联或修改。

跳转主页:【Python笔记】设计模式-CSDN博客

相关推荐
江畔柳前堤2 天前
具身智能全景深度指南(2026年9月版):从“会聊天的AI“到“能干活的机器“
大数据·javascript·图像处理·人工智能·分布式·智慧城市·原型模式
神奇霸王龙7 天前
Codex MCP GA 实测:Qwen / GLM / Kimi / DeepSeek / MiniMax 调度 Codex 沙箱的真实成本
人工智能·ai·agent·ai编程·原型模式·mcp
葡萄城技术团队9 天前
如何通过 JSON 数据源 / Web API 快速构建轻量级报表(Report)?
前端·json·原型模式
Leo.yuan9 天前
2026国内数据治理平台选型指南:从ETL到数据质量的一体化路径
原型模式
一个游离的指针22 天前
JS中的对象的相关概念
开发语言·javascript·原型模式
码哥DFS24 天前
构造函数、实例对象、对象原型 ----三者关系
开发语言·javascript·原型模式
lincats1 个月前
AI Agent 工程化六层架构:从 Prompt 到 Production
人工智能·架构·prompt·知识图谱·原型模式·vibecoding·grillme
叶总没有会1 个月前
5.1知识库概念进阶
java·人工智能·spring·阿里云·ai·原型模式
lincats1 个月前
智能体工程 vs 软件工程:计算机系那套课程,还能适应 AI 时代吗?
人工智能·软件工程·原型模式·vibecoding·claudecode·grillme
ltqvibe1 个月前
数据中台为什么走不通——本体语义给出的替代路径
人工智能·原型模式·本体语义平台