Python设计模式——原型模式

原型模式(Protoype)

也可以称为复制模式。用原型模式,本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,这既隐藏了对象创建的细节,又能大大降低耗时,提高性能。

目的:
原型模式用于减少一个项目所需的类的数量。
对于许多差异较小的子类,原型模式通过复制一个"原型实例"并做少量修改,来替代声明多个子类。

应用场景:
当我们已有一个对象,并希望创建该对象的一个完整副本时,没必要创新创建对象,可以使用原型模式。一般当对象初始化操作比较复杂的情况下,当新的实例更容易通过一个旧实例衍生出来,可以使用原型模式。

优点:
原型模式用于创建复杂的和耗时的实例,复制一个已经存在的实例使程序运行更高效。

缺点:
每一个产品类都必须配置一个克隆方法,并且这个克隆方法需要对类的功能进行整体考虑。

对于原型模式而言,其中最主要的部分就是关于一个对象的复制,其中包含两个方面,1、浅复制;2、深复制

浅复制等于对象的引用,修改会影响到相关的对象

深复制就相当于两个完全独立的东西,互不影响。

python代码实现:

import copy

# 定义一个人的类
class Person():
    def __init__(self, name, age, **info):
        self.name = name
        self.age = age
        # 可以为实例添加其他额外属性,但必须是key:value格式的属性
        self.__dict__.update(info)

    # 当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
    def __str__(self):
        myinfo = []
        for i, v in self.__dict__.items():
            myinfo.append(f'{i}:{v}\n')
        return ''.join(myinfo)


class Prototype():
    def __init__(self):
        self.objects = dict()  # 定义原型对象字典表

    # 在原型字典表中注册原型对象
    def register(self, sign, obj):
        self.objects[sign] = obj

    # 在原型字典表中删除原型对象
    def destory(self, sign):
        del self.objects[sign]

    # 根据 id 在原型字典表中查找原型对象并克隆
    def clone(self, sign, **atter):
        obj1 = self.objects.get(sign)
        if not obj1:
            raise ValueError(f'你要拷贝的对象{sign}不存在: {sign}')
        obj2 = copy.deepcopy(obj1)  # clone关键在于深拷贝函数
        obj2.__dict__.update(atter)  # 新增的属性通过**atter传入并更新
        return obj2


if __name__ == '__main__':
    xiaoming = Person('xiaoming', 34, high='178')

    prototype = Prototype()
    prototype.register(1, xiaoming)
    honghong = prototype.clone(1, name="honghong", age='19', birthday='2010-02-02')

    print(xiaoming)
    print(honghong)
    
    # 输出两个Person对象是否是相同的id值
    print(f"id xiaoming : {id(xiaoming)} != id honghong : {id(honghong)}")

    
# ====================结果输出========================
name:xiaoming
age:34
high:178

name:honghong
age:19
high:178
birthday:2010-02-02

id xiaoming : 1895679147760 != id honghong : 1895679147480

你可能感兴趣的:(设计模式,原型模式,python,设计模式)