设计模式 - 原型模式

原型模式(Prototype Pattern)主要用于复制、克隆;

如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型、公用部分)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间和空间的目的。

为什么使用原型模式

  • 减少对象实例化带来的损耗
  • 提高对象的复用性(共用部分)
  • 对有大量计算和cpu、io等操作,但是可以直接使用操作后的值(类似缓存)生成的对象复用减少重复计算

原型模式缺点

需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”。

原型模式的实现方式

目前原型模式主要的实现方式有两种:

  • 浅拷贝
  • 深拷贝

主要区别在于:

  • 浅拷贝:它只会拷贝对象中的不可变类型(比如,int、string),以及可变类型的内存地址,不会递归地可变类型本身。
  • 深拷贝:无论可变类型还是不可变类型,会一直递归拷贝一份完全新的。

⚠️:深拷贝比浅拷贝需要更多的资源,按照实际场景选择,并没有哪种一定更好。以下几个是深、浅拷贝的主要应用场景:

  • 当我们克隆出来的对象,我们希望不要互相影响时,就必须使用深拷贝。
  • 当互相影响无所谓时,甚至说克隆出来的对象,必须共享这些可变变量时,或者为了提升性能,就可以使用浅拷贝。

代码实现

首先我们创建原型模式中的原型,并分别通过浅拷贝及深拷贝的方式实现原型模式。

通过一个广东省下的市的例子来实现原型模式的讲解,每一个省下都有很多个市,这些市共享相同的一些属性(属于同样的省),不用每次实例化市的对象时重复创建共享的省属性。

# 原型
class GuangDongProperty:
    def __init__(self):
        self.name = "GuangDong"
        self.loc = "south east"
        self.pro_area = "xxxx cubic meters"

浅拷贝实现

python实现浅拷贝原型模式:

import copy

class CityProtoType:
    def __init__(self, obj):
        self.obj = obj()

    def clone(self, **city_dict):
        obj = copy.copy(self.obj)
        obj.__dict__.update(city_dict)
        return obj

深拷贝实现

python实现深拷贝原型模式:

import copy

class CityProtoType:
    def __init__(self, obj):
        self.obj = obj()

    def clone(self, **city_dict):
        obj = copy.deepcopy(self.obj)
        obj.__dict__.update(city_dict)
        return obj

总结

原型模式作为一种快速创建大量相同或相似对象的方式,在软件开发中应用较为广泛,一个典型的应用场景就是业务数据库进行增量更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tlqwanttolearnit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值