06、设计模式Python版- 原型模式

基本介绍

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。

当直接创建对象的代价比较大时,则采用这种模式。

特点:仅存在一份,后面如果要用类似的就进行克隆拷贝,拷贝方式分2种,深拷和浅拷,原型允许个体中的属性存在差异

原型模式更适用于创建一个通用的模板,后续要使用时在此模板的基础上对实例属性进行一定范围内的变更。

该模式属于创建型模式。

案例图示

每台计算机的构成都是类似的,如果要同时组装多台计算机,可采用原型模式进行设计。

只实例化一次,减少实例化的消耗,后续个体都通过拷贝原型并修改其中属性实现差异化:

 

优缺点

优点:

  • 性能提高,减少实例化时的内存消耗
  • 节省内存
  • 简化对象创建,同时避免了构造函数的约束,不受构造函数的限制直接复制对象,是优点,也有隐患,这一点还是需要多留意一些

缺点:

  • 深拷贝和浅拷贝的使用需要事先考虑周到
  • 某些编程语言中,拷贝会影响到静态变量和静态函数的使用

代码实现

用Python实现原型模式:

import copy

# 计算机原型
class ComputerPrototype:

    def __init__(self) -> None:
        self.cpu = None
        self.gpu = None
        self.ram = None

    def getInfo(self):
        return "cpu : %s\ngpu : %s\nram : %s" % (self.cpu, self.gpu, self.ram)

# 原型建造类
class Prototype:
    def __init__(self) -> None:
        self.prototype = ComputerPrototype()

    def getComputer(self, cpu, gpu, ram):
        computer = copy.deepcopy(self.prototype)
        computer.__dict__.update({"cpu": cpu, "gpu": gpu, "ram": ram})
        return computer
if __name__ == "__main__":
    pro = Prototype()
    computerOne = pro.getComputer(cpu="Intel", gpu="Nvidia", ram="Samsung")
    computerSecond = pro.getComputer(cpu="AMD", gpu="AMD", ram="Kingston")
    print(computerOne.getInfo())
    print(computerOne.getInfo())

# cpu : Intel
# gpu : Nvidia
# ram : Samsung

# cpu : Intel
# gpu : Nvidia
# ram : Samsung