Design 原型模式

基本介绍

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

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

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

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

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

案例图示

一个国家的基础构成信息总是类似的,如果有多个国家需要生成基本信息,可采用原型模式进行设计,减少实例化的消耗:

image-20210412163030159

优缺点

优点:

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

缺点:

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

Python实现

用Python实现原型模式:

#! usr/local/bin/python3
# -*- coding:utf-8 -*-

import copy


class NationalInformationTemplate(object):
    """国家信息模板"""

    def __init__(self):
        self.name = None
        self.number = None
        self.position = None

    def name_entry(self, name):
        self.name = name

    def number_entry(self, num):
        self.number = num

    def position_entry(self, position):
        self.position = position

    def get_info(self):
        return """
            国家名称:%s
            人口总数:%s
            地理位置:%s
        """ % (self.name, self.number, self.position)


class Prototype(object):
    """原型建造类"""

    def __init__(self, template):
        # 只实例化一次
        self.copy_object = template()

    def deep_clone(self, **kwargs):
        obj = copy.deepcopy(self.copy_object)
        obj.__dict__.update(kwargs)
        return obj


if __name__ == '__main__':
    # 创建原型实例,传入模板,只实例化一次
    prototype_instance = Prototype(NationalInformationTemplate)

    # 根据原型构建国家基本信息
    china_information = prototype_instance.deep_clone(name="中国", number=1400000000, position="亚洲")
    print(china_information.get_info())

    usa_information = prototype_instance.deep_clone(name="美国", number=700000000, position="美洲")
    print(usa_information.get_info())

Golang实现

用Golang实现原型模式:

...
posted @ 2021-04-12 16:40  云崖君  阅读(64)  评论(0编辑  收藏  举报