04-原始模型(Prototype)模式Python实现

 

本文用一个实例场景描述Gof23设计模式中的原始模型模式,并用Python程序代码给予实现,同时也给出实现代码的UML模型。...



摘要:本文用一个实例场景描述Gof 23设计模式中的原始模型模式,并用Python程序代码给予实现,同时也给出实现代码的UML模型。

关键字:Gof 23 设计模式 原始模型模式  Python

Prototype Patternbased on Python
REN gang


Abstract:This paper gives a scene example to describe theuse of Prototype Pattern of Gof 23 Design Pattern, and achieves the example by Python,at the same time, gives the UML model of realization of the example.

Key word: Gof 23  Design Pattern;  Prototype Pattern  Python

1. 标准定义

原型模式标准定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2. 分析和说明

原型模式是指用原型实例指定创建对象的种类,并且通过拷贝(克隆)这些原型创建新的对象。原型模式也是一种创建性模式。当一个系统应该独立于它的产品创建、构成和表示,以及当要实例化的类是在运行时刻指定时,可使用原型模式。原始模型模式适用于任何的等级结构。原型模式的结构如图1。原型模式的缺点是每一个类都必须配备一个克隆方法。

Prototype的角色包括客户(Client)角色、抽象原型(Prototype)角色和具体原型(Concrete Prototype)角色。Prototype用来声明一个拷贝自身的接口,ConcretePrototype用来实现一个拷贝自身的操作;Client用来让一个原型拷贝自身从而创建一个新的对象

图1 原始模型模式的标准结构图
    客户(Client)角色:客户类提出创建对象的请求。

    抽象原型(Prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口。

    具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。

3 应用场景举例

比如公司对于各个产品都有自己的宣传资料。每个宣传资料的组成都是首先对公司进行介绍。其次是对公司组织结构介绍,中间内容才是对产品的技术介绍,案例说明,最后还要留下公司的通信联系方式。所以,对于不同产品的宣传资料中关于公司介绍、组织机构和公司的通信地址都是一样的。这样就可以采用Prototype。从基本的公司产品资料中克隆出来一个介绍模板,然后根据具体产品再说明各个产品的技术参数。在这里可以把AbstractPrototype理解为抽象原型(Prototype)角色。CompanyBaseIntroduction是具体原型(Concrete Prototype)角色。其实现类图如下:

图2 原始模型模式的类图
4.Python的实现程序代码

Python程序实现主要包括AbstractPrototype抽象类,CompanyBaseIntroduction类2个类。其实现类如图2所示。下面分别列出这2个类的程序代码,最后列出测试代码并显示输出结果。
程序代码清单01
class AbstractPrototype:

def __init__ (self):

self.introductionMap = {}

def cloneMyself(self):

raise NotImplementError("AbstractPrototype")

def addSomeIntrouction(self,topic,content):

raise NotImplementError("AbstractPrototype")

def deleteSomeIntrouction(self,key):

raise NotImplementError("AbstractPrototype")

def showIntrouction(self):

raise NotImplementError("AbstractPrototype")

class CompanyBaseIntroduction(AbstractPrototype):

def cloneMyself(self):

self.addSomeIntrouction("公司介绍", "这是公司基本介绍")

#return CompanyBaseIntroduction(introductionMap)

return self

def addSomeIntrouction(self,topic,content):

self.introductionMap[topic] = content

def deleteSomeIntrouction(self,topic):

del self.introductionMap[topic]

def showIntrouction(self):

for i in self.introductionMap:

print  ("dict[%s]=" % i,self.introductionMap)

def main():

print("———这是prototype的输出开始———");

departA =CompanyBaseIntroduction().cloneMyself()

departA.addSomeIntrouction("部门A介绍",  "这是部门A介绍的内容")

departA.showIntrouction();

departB = departA.cloneMyself();

departB.deleteSomeIntrouction("部门A介绍");

departB.addSomeIntrouction("部门B介绍",  "这是部门B介绍的内容");

departB.showIntrouction();

print("———这是prototype的输出结束———");

if __name__ == '__main__':

main()

原始模型测试类输出结果如下所示:

prototype设计模式(对象方式).

———这是prototype的输出开始———

dict[部门A介绍]= 这是部门A介绍的内容

dict[公司介绍]= 这是公司基本介绍

dict[部门B介绍]= 这是部门B介绍的内容

dict[公司介绍]= 这是公司基本介绍

———这是prototype的输出结束———

参考文献

[1] E.Gamma, R.Helm, R.Johnson, andVlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley,1995

[2] E.Gamma, R.Helm, R.Johnson, andVlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.2000.9.

[3] [美] Alan Gauld 著,刘彩虹 张光庭 译,用Python学编程,北京:清华大学出版社.2002.9.

[4] [美] Magnus Lie Hetland 著, 译,Python基础教程(第2版),北京:人民邮电出版社.2010.

[5] [美] Mark Summerfield 著,王弘博,孙传庆 译,Python 3程序开发指南,北京:人民邮电出版社.2011.2.


    关注 架构设计模式


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册