原型设计模式主要在当新建一个对象的时候,觉得很麻烦,并且你又要保留当前对象。在这种情况下使用原型设计模式是一个很好的解决办法。
例如你写一个东西更新,不同的版本,这个时候以前的版本肯定要保留,并且从此基础上进行迭代,这个时候你就需要新建一个副本进行二次编写或者开发,进行新功能编写。
在我理解,设计模式是一种设计思想、解决方案,并不局限于固定的代码编写方式,只要符合于该思想即可,所以代码的实现只是一个实现样例,并不是唯一答案。毕竟条条道路通北京,怎么走还是得看你自己。
想要完全的从实际业务上考虑代码设计所使用的设计模式,需要丰富的项目编写(业务逻辑处理)经验,所以在此并不多举例应用场景,毕竟你也有可能把一个原型模式玩出了花。
开始
以下例子用一个矿泉水生产不同的外观进行举例。
矿泉水生产,同一个类型可能有不同包装版本。体积容量、包装样式可能一致,不同版本可能外表印刷颜色不同。
首先写一个类( 为了方便新手,以下会说明代码释义,完整代码在最下面 ):
class MineralWater:
volume = '' # 体积
packing = '' # 包装用瓶子
name = '' # 颜色
def __init__(self, name,volume,packing):
self.name = name
self.volume = volume
self.packing = packing
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
def get_volume(self):
return self.volume
def get_packing(self):
return self.packing
类名为 MineralWater(矿泉水),有 3 个类成员变量:
- volume 用来描述装水的体积
- packing 用来描述包装水的物体用什么
- name 表示不同的型号包装,不同型号会导致印刷不一样
类中一共有 5 个方法,初始化一个,其余方法为成员变量的存取方法:
-
__init__
方法用来初始化原型,接收参数为 name,volume 以及 packing - set_name 方法用来设置 name 变量
- get_name 方法用来取得 name 变量
- 其他方法是存取方法,不再赘述
再建一个工厂类:( 这个类其实可以不用,不过为了方便说明,再次还是写一下。读者只需要了解其中关键代码即可 )
class Factory:
def __init__(self, name):
self.name = name
self.mwater = MineralWater('矿泉水卡通版',555,"plastic_bottle") # 原型
def assembly_line(self):# 工厂装配
for v in self.name:
mwater_ = copy(self.mwater)
mwater_.set_name(v)
print('已装配', mwater_.get_name(),'矿泉水, 容量为' ,mwater_.get_volume(), ',包装为:' + mwater_.get_packing())
print('\n 原型并未被改变:', self.mwater.get_name(),'矿泉水, 容量为' ,self.mwater.get_volume(), ',包装为:' + self.mwater.get_packing())
Factory(工厂类)中有 2 个方法,一个为初始化 __init__
方法,一个为 assembly_line
(流水线)方法。__init__
方法中定义了原型,assembly_line
方法实现了原型复制。
在 __init__
初始化方法中接收一个产品型号说明变量 name 作为参数,由于之后需要遍历这个参数,所以该参数应该设置为列表或者是元组;并且在 name 进行设置后,定义了一个原型对象 mwater,mwater 为卡通版,容量为 555 毫升,包装使用 plastic_bottle(塑料瓶)。
在 assembly_line
流水线方法中,遍历了传入的列表或者元组成员数据 name,每一次遍历使用 mwater_ = copy(self.mwater)
复制一个对象(copy 需要引入:from copy import copy
),并且使用 mwater_.set_name(v) 设置新的对象 name 值 (这个 v 为传入的不同版本的名称),随后使用 print 进行输出,每次其它相同值并不需要重新设置,只需要改变不同的值即可。最后输出原型对象查看其数据是否被改变。
测试代码:
f = Factory(['矿泉水卡通版', '矿泉水程序员版', '矿泉水产品经理版'])
f.assembly_line()
运行结果:
结果发现原型并未改变,符合需求。
完整代码:
from copy import copy
class MineralWater:
volume = '' # 体积
packing = '' # 包装用瓶子
name = '' # 颜色
def __init__(self, name,volume,packing):
self.name = name
self.volume = volume
self.packing = packing
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
def get_volume(self):
return self.volume
def get_packing(self):
return self.packing
class Factory:
def __init__(self, name):
self.name = name
self.mwater = MineralWater('矿泉水卡通版',555,"plastic_bottle") # 原型
def assembly_line(self):# 工厂装配
for v in self.name:
mwater_ = copy(self.mwater)
mwater_.set_name(v)
print('已装配', mwater_.get_name(),'矿泉水, 容量为' ,mwater_.get_volume(), ',包装为:' + mwater_.get_packing())
print('\n 原型并未被改变:', self.mwater.get_name(),'矿泉水, 容量为' ,self.mwater.get_volume(), ',包装为:' + self.mwater.get_packing())
f = Factory(['矿泉水卡通版', '矿泉水程序员版', '矿泉水产品经理版'])
f.assembly_line()