python 实现原型设计模式

举报
1_bit 发表于 2021/04/20 00:41:08 2021/04/20
【摘要】 原型设计模式主要在当新建一个对象的时候,觉得很麻烦,并且你又要保留当前对象。在这种情况下使用原型设计模式是一个很好的解决办法。 例如你写一个东西更新,不同的版本,这个时候以前的版本肯定要保留,并且从此基础上进行迭代,这个时候你就需要新建一个副本进行二次编写或者开发,进行新功能编写。 在我理解,设计模式是一种设计思想、解决方案,并不局限于固定的代码编写方式,只要符合于...

原型设计模式主要在当新建一个对象的时候,觉得很麻烦,并且你又要保留当前对象。在这种情况下使用原型设计模式是一个很好的解决办法。

例如你写一个东西更新,不同的版本,这个时候以前的版本肯定要保留,并且从此基础上进行迭代,这个时候你就需要新建一个副本进行二次编写或者开发,进行新功能编写。

在我理解,设计模式是一种设计思想、解决方案,并不局限于固定的代码编写方式,只要符合于该思想即可,所以代码的实现只是一个实现样例,并不是唯一答案。毕竟条条道路通北京,怎么走还是得看你自己。

想要完全的从实际业务上考虑代码设计所使用的设计模式,需要丰富的项目编写(业务逻辑处理)经验,所以在此并不多举例应用场景,毕竟你也有可能把一个原型模式玩出了花。

开始

以下例子用一个矿泉水生产不同的外观进行举例。
矿泉水生产,同一个类型可能有不同包装版本。体积容量、包装样式可能一致,不同版本可能外表印刷颜色不同。

首先写一个类(为了方便新手,以下会说明代码释义,完整代码在最下面):

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

类名为 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())

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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()

  
 
  • 1
  • 2

运行结果:
在这里插入图片描述
结果发现原型并未改变,符合需求。
完整代码:

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()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

文章来源: blog.csdn.net,作者:1_bit,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/A757291228/article/details/106992867

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。