python:水果与设计模式-原型模式

原型模式(Prototype Pattern):属于创建型模式,它提供了一种创建对象的最佳方式。这种模式实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

主要解决 在运行期建立和删除原型。

何时使用 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3、为了避免创建一个与产品类层次平行的工厂类层次时。 4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

如何解决 利用已有的一个原型对象,快速地生成和原型对象一样的实例。

关键代码 1、实现克隆操作。 2、原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些"易变类"拥有稳定的接口

优点 1、性能提高。 2、逃避构造函数的约束

缺点 1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。 2、必须实现 Clone接口。

注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝采用copy.copy()实现,而深拷贝采用copy.deepcopy()实现。

应用实例 夏天到了,我们超市的水果限时促销活动异常火爆,而这些促销的水果面临高并发的负载压力,我们采用原型模式为这些参与促销的水果提供更加高速地访问。

python:水果与设计模式-原型模式_第1张图片

那我们一起使用建造者模式,实现一个促销水果的管理项目吧!(づ。◕ᴗᴗ◕。)づ

实现的思路:

  • 项目的核心包括3个部分:FruitCache(促销水果的缓冲区)负责生产参与促销的水果Fruit(参与促销的水果模型)负责提供参与促销水果的原型信息和功能Grape(葡萄类)、Hami_Melon(哈密瓜类)、Orange(橘子类)是具体的水果实现

项目的UML用例图如下:

python:水果与设计模式-原型模式_第2张图片

实现的代码如下:

from copy import deepcopy


class Fruit:
    def __init__(self, weight=0.0, package=False):
        self.name = None
        self.weight = weight
        self.price = 0
        self.package = package
        self.promotion_price = 0

    def show(self):
        pack = "袋装"
        if self.package:
            pack = "盒装"
        print("水果名称:%s\n重量:%.2f(千克)\n价格:%.2f(元/千克)\n包装方式:%s\n原需支付的金额:%.2f(元)\n限时促销价:%.2f(元)!!!"
              % (self.name, self.weight, self.price, pack, self.weight * self.price, self.promotion_price))
        print("-*-" * 15)

    def deep_clone(self):
        return deepcopy(self)


class Grape(Fruit):
    def __init__(self, weight=0.0, package=False):
        super().__init__(weight, package)
        self.name = "葡萄"
        self.price = 18.0
        self.promotion_price = 28.99


class Hami_Melon(Fruit):
    def __init__(self, weight=0.0, package=False):
        super().__init__(weight, package)
        self.name = "哈密瓜"
        self.price = 22.0
        self.promotion_price = 39.99


class Orange(Fruit):
    def __init__(self, weight=0.0, package=False):
        super().__init__(weight, package)
        self.name = "橘子"
        self.price = 12.5
        self.promotion_price = 18.88


class FruitCache:
    def __init__(self):
        self.fruits = []

    def load_cache(self):
        grape_1 = Grape(2.5, True)
        self.fruits.append(grape_1)

        grape_2 = grape_1.deep_clone()
        self.fruits.append(grape_2)

        hami_melon = Hami_Melon(3.2, False)
        self.fruits.append(hami_melon)

        orange = Orange(2.6, True)
        self.fruits.append(orange)

        return self.fruits


if __name__ == '__main__':
    use = FruitCache().load_cache()
    print("-*-" * 15)
    for item in use:
        item.show()

相关的测试用例:

python:水果与设计模式-原型模式_第3张图片

本文关于设计模式的讲解思想,参考链接:原型模式

关于深度拷贝和浅拷贝的用法讲解,参考链接:十分钟!彻底弄懂Python深拷贝与浅拷贝机制

往期推荐: 点这里->Python:水果与设计模式-建造者模式

往期推荐: 点这里->Python:水果与设计模式-单例模式

往期推荐: 点这里->Python:水果与设计模式-抽象工厂模式

往期推荐: 点这里->Python:水果与设计模式-工厂模式

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