【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博客

相关推荐
希冀1233 天前
【JavaScript】Javascript—JS进阶—Day03
开发语言·javascript·原型模式
想吃火锅100522 天前
【前端手撕】instanceof
前端·javascript·原型模式
UXbot22 天前
帮助企业低门槛开展AI应用开发的平台推荐
前端·低代码·ui·交互·产品经理·原型模式·web app
UXbot22 天前
如何选择适合公司项目的UI设计工具?企业选型指南
前端·低代码·ui·团队开发·原型模式·设计规范·web app
UXbot22 天前
原型设计工具如何帮助新人快速进入产品行业?
前端·低代码·ui·交互·团队开发·原型模式·web app
sunny.day1 个月前
js原型与原型链
开发语言·javascript·原型模式·js原型链
UXbot1 个月前
AI网页开发工具能替代工具吗?5大平台对比
前端·人工智能·低代码·ui·原型模式·web app
weixin_307779131 个月前
从“大海捞针”到“主动推理”:AI如何重塑云原生故障诊断的根因链
开发语言·人工智能·算法·自动化·原型模式
swordbob1 个月前
prototype 注入到 singleton 里,prototype是否还是线程安全的
安全·spring·单例模式·原型模式
isNotNullX1 个月前
企业数据中台建设,ETL工具选错了会踩哪些坑?
数据仓库·etl·原型模式