第四天:创建型模式--原型模式

简介: 第四天:创建型模式--原型模式

####零、原型模式


  • 什么是原型模式:

原型模式无非就是克隆一个对象,其最简单的形式就是一个 clone() 函数,接受一个对象作为输入参数,返回输入对象的一个副本。在 Python 中可以使用 copy.deepcopy() 函数来完成。


  • 什么是副本:

一个对象在 某一时间点 的 完全 复制,时间是一个重要元素,因为它会影响克隆所包含的内容。


  • 引用和副本间的区别:

如果A和B都持有同一个对象的引用,那么A修改对象后,B就能看到对象的修改,反之亦然。

如果A和B都持有一个对象的副本,呢么A修改所持有的副本,B是看不到修改的,反之亦然。因为A和B所持有的副本是两个独立的内存地址。


####一、身边的例子


  • 细胞的分裂。细胞核分裂产生两个新的细胞核,这两个细胞都具有原来细胞相同的染色体、DNA等。
  • VTK(可视化工具套件)。VTK是一个开源的跨平台的系统,用于三位计算图形和图片处理以及可视化。VTK利用原型模式来创建几何元素。
  • Python中很多应用也都使用了原型模式。


####二、什么情况下使用


  1. 当我们已有一个对象,并希望创建该对象的一个完整副本时;
  2. 在我们知道对象的某些本分会被改变,但有希望保持原有的对象不变时;
  3. 我们想复制一个复杂的对象时。


####三、应用案例


下面我们来看一个案例,利用原型模式展示一个图书的各个版本信息

import copy
from collections import OrderedDict
class Book:
    def __init__(self, name, authors, price, **rest):
        '''rest的例子有:出版商、长度、标签、出版日期'''
        self.name = name
        self.authors = authors
        self.price = price
        self.__dict__.update(rest)
    def __str__(self):
        mylist = []
        ordered = OrderedDict(sorted(self.__dict__.items()))
        for i in ordered.keys():
            mylist.append('{}:{}'.format(i, ordered[i]))
            if i == 'price':
                mylist.append('$')
            mylist.append('\n')
        return ''.join(mylist)
class Prototype:
    def __init__(self):
        self.objects = dict()
    def register(self, identifiter, obj):
        self.objects[identifiter] = obj
    def unregister(self, identifier):
        del self.objects[identifier]
    def clone(self, identifier, **attr):
        found = self.objects.get(identifier)
        if not found:
            raise ValueError('Incorrect object identifier:{}'.format(identifier))
        obj = copy.deepcopy(found)
        obj.__dict__.update(attr)
        return obj
def main():
    b1 = Book('The Cprogramming Language', ('Brian W.Kernighan', 'Dennis M.Ritchie'), price=118,
              publisher='Prentice Hall', length=228, publication_date='1978-02-22',
              tags=('C', 'programming', 'algorithma', 'algorihma', 'data structures'))
    prototype = Prototype()
    cid = 'k&r-first'
    prototype.register(cid, b1)
    b2 = prototype.clone(cid, name='The CProgramming Language(ANSI)', price=48.99, length=274,
                         publication_date='1988-04-01', edition=2)
    for i in (b1, b2):
        print(i)
    print('ID b1:{}!= ID b2:{}'.format(id(b1), id(b2)))
if __name__ == '__main__':
    main()
目录
相关文章
|
2月前
|
人工智能 安全 程序员
OpenClaw本地部署TopClaw,小龙虾AI零基础一键安装指南
TopClaw是OpenClaw官方内核的中文汉化版,专为小白设计:一键安装、零代码、免配置,支持Win/Mac全平台。内置模型下载器、本地离线运行、数据不出设备,隐私安全有保障。三分钟即可部署满血AI助手,写稿、翻译、编程轻松搞定。
306 7
|
6月前
|
JSON 前端开发 API
用Pydantic实现Python数据校验的最佳实践
本文以小张调试用户注册报错为引,生动揭示Python后端数据校验混乱的痛点:规则散落、类型错误频发、业务逻辑被校验淹没。随即引出Pydantic解法——通过声明式模型(如`class User(BaseModel): username: str; age: int = Field(ge=18)`),实现自动类型转换、嵌套校验、字段约束与清晰错误提示,大幅提升代码可读性、健壮性与可维护性。(239字)
440 0
|
3月前
|
人工智能 自然语言处理 定位技术
Coze 3.0来了!别再自己复制、粘贴搬上下文了!
Coze 3.0聚焦真实协同痛点,首创「项目级A2A协作」:支持多人+多Agent灵活组队、跨端(网页/桌面/手机)无缝衔接、本地与云端Agent统一调度,并内置行业模板与专业技能。告别复制粘贴、上下文断层与工具割裂,让资料、对话、决策、产出在同一个项目中自然流转——AI真正在帮你扛事,而非添乱。(239字)
|
5月前
|
Java 开发工具 Android开发
HarmonyOS鸿蒙应用备案高效获取公钥和证书MD5指纹的保姆级教程
本文详解鸿蒙应用(HarmonyOS Next)公钥与证书MD5指纹的三种获取方式:①通过AGC平台下载.cer证书后在线解析;②在AGC控制台直接复制“验证公钥”及已配置的证书指纹;③使用OpenSSL命令行本地提取(无需联网)。适用于ICP备案及第三方SDK接入场景,助力开发者快速完成配置。(239字)
990 2
|
5月前
|
自然语言处理 安全 算法
不懂技术怎么做网站?三种建站方式客观对比
本文通俗讲解网站建设的含义、完整流程与核心作用,介绍模板、CMS、定制开发三种建站方式,并从预算、用途、长远发展角度给出建站方式选择建议。
376 0
|
7月前
|
人工智能 算法 安全
AI智能体的开发费用
AI智能体开发费用远超普通聊天机器人,核心溢价在于自主决策与工具调用能力。2026年国内分四档:基础型(0.5–3万)、行业增强型(10–30万)、企业级全自动型(50–150万+),另含持续性Token、算力与逻辑维护成本。重在流程工程化,而非模型采购。
|
10月前
|
存储
参数不是越多越好?聊聊模型规模与智能能力的那些“门道”
参数不是越多越好?聊聊模型规模与智能能力的那些“门道”
832 2
|
消息中间件 NoSQL 大数据
RocketMQ实战—5.消息重复+乱序+延迟的处理
本文围绕RocketMQ的使用与优化展开,分析了优惠券重复发放的原因及解决方案。首先,通过案例说明了优惠券系统因消息重复、数据库宕机或消费失败等原因导致重复发券的问题,并提出引入幂等性机制(如业务判断法、Redis状态判断法)来保证数据唯一性。其次,探讨了死信队列在处理消费失败时的作用,以及如何通过重试和死信队列解决消息处理异常。接着,分析了订单库同步中消息乱序的原因,提出了基于顺序消息机制的代码实现方案,确保消息按序处理。此外,介绍了利用Tag和属性过滤数据提升效率的方法,以及延迟消息机制优化定时退款扫描的功能。最后,总结了RocketMQ生产实践中的经验.
RocketMQ实战—5.消息重复+乱序+延迟的处理
|
机器学习/深度学习 算法 数据安全/隐私保护
基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络
本项目展示了人脸识别算法的运行效果(无水印),基于MATLAB2022A开发。核心程序包含详细中文注释及操作视频。理论部分介绍了广义回归神经网络(GRNN)、概率神经网络(PNN)、深度神经网络(DNN)和反向传播(BP)神经网络在人脸识别中的应用,涵盖各算法的结构特点与性能比较。
|
Cloud Native Docker 容器
免费Docker镜像服务
近期,一位博友分享了如何利用Cloudfare路由功能实现Docker镜像代理的方法。本文作者则选择了一种更为简便的方式,直接使用道客(DaoCloud)提供的Docker镜像代理服务,该服务已稳定运行半年以上,支持通过添加域名前缀或修改配置文件两种方式使用。
1020 4

热门文章

最新文章