15年做那些网站能致富,网页版梦幻西游金色伙伴推荐,网页制作素材去哪找,网站后台怎么换图片原型设计模式主要在当新建一个对象的时候#xff0c;觉得很麻烦#xff0c;并且你又要保留当前对象。在这种情况下使用原型设计模式是一个很好的解决办法。
例如你写一个东西更新#xff0c;不同的版本#xff0c;这个时候以前的版本肯定要保留#xff0c;并且从此基础上…原型设计模式主要在当新建一个对象的时候觉得很麻烦并且你又要保留当前对象。在这种情况下使用原型设计模式是一个很好的解决办法。
例如你写一个东西更新不同的版本这个时候以前的版本肯定要保留并且从此基础上进行迭代这个时候你就需要新建一个副本进行二次编写或者开发进行新功能编写。
在我理解设计模式是一种设计思想、解决方案并不局限于固定的代码编写方式只要符合于该思想即可所以代码的实现只是一个实现样例并不是唯一答案。毕竟条条道路通北京怎么走还是得看你自己。
想要完全的从实际业务上考虑代码设计所使用的设计模式需要丰富的项目编写业务逻辑处理经验所以在此并不多举例应用场景毕竟你也有可能把一个原型模式玩出了花。
开始
以下例子用一个矿泉水生产不同的外观进行举例。 矿泉水生产同一个类型可能有不同包装版本。体积容量、包装样式可能一致不同版本可能外表印刷颜色不同。
首先写一个类为了方便新手以下会说明代码释义完整代码在最下面
class MineralWater:volume # 体积packing # 包装用瓶子name # 颜色def __init__(self, name,volume,packing):self.name nameself.volume volumeself.packing packingdef set_name(self, name):self.name namedef get_name(self):return self.namedef get_volume(self):return self.volumedef get_packing(self):return self.packing类名为 MineralWater矿泉水有3个类成员变量
volume 用来描述装水的体积packing 用来描述包装水的物体用什么name 表示不同的型号包装不同型号会导致印刷不一样
类中一共有5个方法初始化一个其余方法为成员变量的存取方法
__init__ 方法用来初始化原型接收参数为 namevolume以及packingset_name 方法用来设置name 变量get_name 方法用来取得name 变量其他方法是存取方法不再赘述
再建一个工厂类这个类其实可以不用不过为了方便说明再次还是写一下。读者只需要了解其中关键代码即可
class Factory:def __init__(self, name):self.name nameself.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进行设置后定义了一个原型对象 mwatermwater为卡通版容量为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 copyclass MineralWater:volume # 体积packing # 包装用瓶子name # 颜色def __init__(self, name,volume,packing):self.name nameself.volume volumeself.packing packingdef set_name(self, name):self.name namedef get_name(self):return self.namedef get_volume(self):return self.volumedef get_packing(self):return self.packingclass Factory:def __init__(self, name):self.name nameself.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()