python 实现原型设计模式

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

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

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

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

开始

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

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

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__ 方法用来初始化原型,接收参数为 name,volume以及packing
  • set_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进行设置后,定义了一个原型对象 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 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

装服务器显示磁盘脱机,服务器磁盘处于脱机

服务器磁盘处于脱机 内容精选换一换配置目的端或启动目的端时提示“SMS.1311 目的端磁盘个数不够”。在配置目的端服务器过程中,会校验目的端磁盘数量是否和源端一致。当出现该错误时,检查目的端服务器磁盘数量是否少于源端服务器磁盘数量,或…

剑指offer之重建二叉树

1 问题 重建二叉树:给定二叉树的先序遍历(根左右)和中序(左中右)遍历结果,建立这棵二叉树。输入保证二叉树无重复结点 以先序{1, 2, 4, 7, 3, 5, 6, 8}和中序{4, 7, 2, 1, 5, 3, 8, 6}为例 2 分析 先序遍…

ArcGIS 10.5专题地图制作自定义漂亮图框

先来看一下效果: 下面来说明如何在ArcGIS软件里面实现自定义图框。 1. 【自定义】→【样式管理器】→【Administrator.style】→【边框】→【新建】→【常规边框】。 2. 点击【更改符号】。 3. 点击【编辑符号】。

当我会AOP之后,去丈母娘家都是挺着胸脯!

当和朋友谈到AOP时,第一映像会说AOP的应用层面,比如拦截器、过滤器,实现复用等等使用层面上。这些应用层面上的回答远远没有深入AOP的思想。是的,AOP是思想,面向切面思想。既然是编程思想,那我们就有必要了…

python 最简单的实现适配器设计模式

适配器设计模式是懒得改动某些代码,或者某些接口不方便改动的时候,使用一个特定的封装,一些特定的编写办法,使不同的接口可以使用同种调用方式使用。 更简单的说话则是,例如几个不同的接口 aliyun、qiniuyun、tencent…

Envi和ArcGIS软件打开和处理.NC4数据

NC4是NetCDF-4的简缩形式。 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。目…

C#多线程调试

概要这篇文章主要分享多线程部分调试技巧,在日常的开发工作中会经常遇到多线程调试的需要。在我们调试的过程中会出现断点的焦点在多个线程之间“反复横跳”根本无法集中跟踪某一个线程的操作链路。那么今天我们来看看如何调试操作。如果有其它需要的可以参考下面微…

最速下降法(梯度下降法)

最速下降法的影子在机器学习中正是无处不在,它简单实用。 一、表示 在最速下降法中,对权值向量w的连续调整是在最速下降的方向上,即它是与梯度向量方向相反的,梯度向量记为(1),简记(…

游戏服务器销售额,游戏服务器销售一个月

游戏服务器销售一个月 内容精选换一换应用容器化改造有三种方式,您可单击这里查看。本教程以某游戏为例,将该游戏进行微服务的架构改造,再进行容器化。本教程不对改造细节做深度讲解,仅讲解大致的建议。如需要详细了解容器化改造的…

使用AppCompat项目模版

2019独角兽企业重金招聘Python工程师标准>>> 使用AppCompat项目模版 从Android API 22开始,谷歌推荐使用AppCompatActivity来构建带标题栏的App,而不是原有的ActionBarActivity。如果用户想要使用AppCompatActivity,可以使用Xamar…

python3 最基本且简单的实现组合设计模式

组合模式是把一个类别归为一个整体,并且组织多个整体之间的关系,使用通过树形结构来描述所有整体。 一般的编写方式为一个类别对象下添加多个该对象的元素,该对象又为其它对象下的元素。简单来说就是一个学校有一个总部,总部下有…

SQL Server 2008 阻止保存要求重新创建表的更改问题

习惯了使用SQL Server 2005进行数据库系统开发,为了赶上潮流的发展,最近在使用SQL 2008数据库,本来建好了一个表,后面需要对表的设计做些修改(比如字段长度的修改,忘记了设置主键等等),结果弹出错误提示,说什么“组织保存要求重新创建表的更改”,如下所示: 解决办法…

$geoNear

怎么使用mongoose的geoNear 2014-11-26 15:05:20| 分类: mongodb | 标签:mongoose |举报|字号 订阅 下载LOFTER我的照片书 |起因 在开发的时候碰到一个情况,数据源有100个景点,需要对给出的一个点,求距离它最近的…

甲骨文宣布供应链管理云平台支持LogFire仓库管理系统

本文讲的是 :甲骨文宣布供应链管理云平台支持LogFire仓库管理系统 ,【IT168 资讯】甲骨文发布了一系列对其供应链管理产品的更新,并表示,云平台现在支持去年收购LogFire的仓库管理系统(WMS)。 ▲ Oracle将在最新版本的Oracle供应链管理(SCM)Cloud产品…

i5老是显示无服务器,为什么懂电脑的人选择买i5处理器,而不是i7,背后的真实原因?...

摘要:我们在选购电脑的时候经常会被五花八门的型号参数看的神魂颠倒,有很多朋友对cpu的理解也仅限于i7一定比i5好,i5一定比i3好的阶段。然而,对于很多懂电脑的人来说,选购电脑时,都不会买i7的CPU处理器&…

python 实现装饰器设计模式

python 装饰器简单、基本的实现并不复杂。装饰器(Decorators)模式类似于继承,当你需要为某一个对象添加额外的动作、行为时,在不改变类的情况下可以使用装饰器。这篇文就当做一篇水文,本来不想写,因为这个专…

Excel抽奖小程序

今天分享一个用Excel制作的抽奖小程序。 如上图,制作一个抽奖小界面,滚动显示区域写入“INDIRECT("A"&RANDBETWEEN(2,13))”,按F9键不放,程序开始运行,松开F9键,抽奖完成。 函数解说&#x…

剑指offer之partition算法

1 问题 partition 算法: 从无序数组中选出枢轴点 pivot,然后通过一趟扫描,以 pivot 为分界线将数组中其他元素分为两部分,使得左边部分的数小于等于枢轴,右边部分的数大于等于枢轴(左部分或者右部分都可能为空&#x…

让DIV中文字换行显示

让DIV中文字换行显示 1. <style>div{white-space:normal;word-break:break-all;word-wrap:break-word; }</style><div style" width:100px; border:1px solid red">I am a doibiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii</div> 未加css前效果&…

WPF效果第一百八十三篇之无缝循环滚动

这不最近一直都在瞎玩Xamarin,渐渐的把WPF给冷落的;假期前突然收到一个着急的模糊不清的需求:图片无缝循环滚动;由于着急我就比较偷懒直接用了很low的方式实现了一版:1、前台就是直接Canvas嵌套StackPanel:<Canvas ClipToBounds"True" x:Name"RootCanvas&quo…