Design 原型模式
基本介绍
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。
当直接创建对象的代价比较大时,则采用这种模式。
特点:仅存在一份,后面如果要用类似的就进行克隆拷贝,拷贝方式分2种,深拷和浅拷,原型允许个体中的属性存在差异
原型模式更适用于创建一个通用的模板,后续要使用时在此模板的基础上对实例属性进行一定范围内的变更。
案例图示
一个国家的基础构成信息总是类似的,如果有多个国家需要生成基本信息,可采用原型模式进行设计,减少实例化的消耗:
优缺点
优点:
- 性能提高,减少实例化时的内存消耗
- 节省内存
- 简化对象创建,同时避免了构造函数的约束,不受构造函数的限制直接复制对象,是优点,也有隐患,这一点还是需要多留意一些
缺点:
- 深拷贝和浅拷贝的使用需要事先考虑周到
- 某些编程语言中,拷贝会影响到静态变量和静态函数的使用
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实现原型模式:
...