当前位置: 首页 > 后端技术 > Python

Python实现了原型设计模式

时间:2023-03-26 18:14:48 Python

原型设计模式主要是在创建新对象的时候,很麻烦,还得保留当前对象。在这种情况下使用原型设计模式是一个很好的解决方案。比如你写一个update或者不同的version,那么之前的version一定要保留下来,在这个基础上迭代。这时候就需要新建一个副本进行二次编写或者开发,编写新的功能。在我的理解中,设计模式就是一种设计思路和解决方案,不局限于固定的代码编写方式,只要符合思路即可,所以代码的实现只是一个实现实例,并不是唯一的答案。毕竟条条大路通北京,怎么走就看你自己了。如果想从实际业务中充分考虑代码设计中使用的设计模式,需要有丰富的项目编写经验(业务逻辑处理),所以这里应用场景不多。毕竟,您也可能会玩出一个原型模式。花。下面的示例以生成不同外观的矿泉水为例。矿泉水生产,同一型号可能有不同的包装版本。容量和包装样式可能相同,不同版本可能有不同的印刷颜色。先写一个类(为了新手方便,下面会讲解代码解读,完整代码在最下面):classMineralWater:volume=''#volumepacking=''#packagingbottlename=''#colordef__init__(self,name,volume,packing):self.name=nameself.volume=volumeself.packing=packingdefset_name(self,name):self.name=namedefget_name(self):returnself.namedefget_volume(self):returnself.volumedefget_packing(self):返回的self.packing类叫做MineralWater(矿泉水),有3个类成员变量:volume用来描述装水的体积,和用什么名字来描述包装水的物体表示不同类型的包装,不同的型号会导致不同的印刷。类中有5个方法,一个是初始化,其他方法是成员变量的访问方法:__init__方法用于初始化原型,接收参数为name、volume和packingset_name方法用于设置名称多变的。get_name方法用于获取name变量。其他方法是访问方法。建个工厂类我就不细说了:(这个类其实是可以用的,但是为了方便说明,我再写一遍。读者只需要看懂关键代码即可)classFactory:def__init__(self,name):self.name=nameself.mwater=MineralWater('矿泉水卡通版',555,"plastic_bottle")#原型defassembly_line(self):#factoryassemblyforvinself.name:mwater_=copy(self.mwater)mwater_.set_name(v)print('Assembled',mwater_.get_name(),'矿泉水,容量为',mwater_.get_volume(),',包装为:'+mwater_.get_packing())print('\n原型未改:',self.mwater.get_name(),'矿泉水,容量为',self.mwater.get_volume(),',packagedas:'+self.mwater.get_packing())Factory(工厂类)中有2个方法,一个是初始化__init__方法,一个是assembly_line(流水线)方法。__init__方法中定义原型,assembly_line方法实现原型拷贝。在__init__初始化方法中,接收一个产品模型描述变量名作为参数。由于后面需要遍历这个参数,所以参数应该设置为列表或者元组;并且在设置好名称之后,定义了一个原型对象mwater,mwater是一个卡通版的,容量为555ml,包装在一个plastic_bottle(塑料瓶)中。在assembly_line管道方法中,遍历传入的list或tuple成员数据名,每次遍历使用mwater_=copy(self.mwater)复制一个对象(copy需要引入:fromcopyimportcopy),使用mwater_。set_name(v)设置一个新的对象名称值(这个v是传入的不同版本的名称),然后用print输出。每次不需要重新设置相同的值,只需更改不同的值即可。最后输出原型对象,看看它的数据有没有变化。测试代码:f=Factory(['矿泉水卡通版','矿泉水程序员版','矿泉水产品经理版'])f.assembly_line()运行结果:原来原型没变,满足要求。完整代码:fromcopyimportcopyclassMineralWater:volume=''#volumepacking=''#packagingbottlename=''#colordef__init__(self,name,volume,packing):self.name=nameself.volume=volumeself.packing=packingdefset_name(self,name):self.name=namedefget_name(self):returnself.namedefget_volume(self):returnself.volumedefget_packing(self):returnself.packing类工厂:def__init__(self,name):self.name=nameself.mwater=MineralWater('矿泉水卡通版',555,"plastic_bottle")#Prototypedefassembly_line(self):#factoryassemblyforvinself.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()