zoukankan      html  css  js  c++  java
  • 原型设计模式

    模式特点:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
    
    程序实例:从简历原型,生成新的简历
    
    代码特点:简历类Resume提供的Clone()方法其实并不是真正的Clone,只是为已存在对象增加了一次引用。
    
         Python为对象提供的copy模块中的copy方法和deepcopy方法已经实现了原型模式,但由于例子的层次较浅,二者看不出区别。
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # 这里肯定要做深拷贝,要不然python的就是对象的引用
    from copy import deepcopy
    
    
    class Client:
        def __init__(self):
            self.x = 1
            self.y = 3
            self.z = 'hello'
            self._foo = 'private'
    
        def __str__(self):
           return '
    '.join(['{}: {}'.format(key, value) for key, value in self.__dict__.items() if not key.startswith('_')])
    
    
    class Prototype:
        def __init__(self):
            self._objs = {}
    
        def registerObject(self, name, obj):
            """注册对象"""
            self._objs[name] = obj
    
        def unregisterObject(self, name):
            """取消注册"""
            del self._objs[name]
    
        def clone(self, name, **attr):
            """克隆对象"""
            try:
                obj = deepcopy(self._objs[name])
                # 但是会根据attr增加或覆盖原对象的属性
                obj.__dict__.update(attr)
                return obj
            except Exception as e:
                pass
    
    
    if __name__ == '__main__':
        client = Client()
        prototype = Prototype()
        prototype.registerObject("client", client)
        client_b = prototype.clone("client", foo="zhangsan", price=80)
    
        print(id(client), client)
        print(id(client_b), client_b)

  • 相关阅读:
    [转]Vetur can't find `tsconfig.json` or `jsconfig.json` in d:VueProjectsmyroute.
    疾病检验的概率的问题
    约束优化方法之拉格朗日乘子法与KKT条件
    GloVe与word2vec
    RNN、LSTM、GRU
    SVM 常见问题
    深度学习常用优化器算法Optimizer详解
    树模型-常见问题点
    leetcode 打家劫舍
    node 图片处理库 sharp
  • 原文地址:https://www.cnblogs.com/renfanzi/p/6031539.html
Copyright © 2011-2022 走看看