设计模式中的原型模式在Python程序中的应用示例

原型模式:
原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,能大大降低耗时,提高性能,因为“不用重新初始化对象,而是动态地获得对象运行时的状态”。

应用特性:
需要大量的基于某个基础原型进行微量修改而得到新原型时使用。

结构特性:
对象的复制机制,即浅复制和深复制。

例1:

#!/usr/bin/env python
#encoding: utf-8
from copy import copy, deepcopy 

class test_obj:
  def __init__(self, id):
    self.id = id 

class proto_type:
  def __init__(self, name, id):
    self.name = name
    self.obj = test_obj(id) 

  def display(self):
    print self.name
    print self.obj.id 

  def clone(self):
    return copy(self) 

  def deep_clone(self):
    return deepcopy(self) 

if '__main__' == __name__:
  obj1 = proto_type('name1', 1)
  obj2 = obj1.clone()
  obj3 = obj1.deep_clone()
  obj2.name = 'name2'
  obj2.obj.id = 2
  obj3.name = 'name3'
  obj3.obj.id = 3
  obj1.display()
  obj2.display()
  obj3.display()
  print obj1.__class__
  print obj2.__class__
  print obj3.__class__

结果:

name1
2    #因为obj2是浅复制,所以对象没有被复制,导致新对象的修改影响了原来的就对象的值
name2
2
name3
3    #因为是深复制,所以不会影响之前的旧对象
__main__.proto_type
__main__.proto_type
__main__.proto_type

这里我们再来回顾一下Python编程基础中关于浅拷贝和深拷贝的知识点:
浅拷贝(Shallow Copy):
指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝的对象和源对象只是名称相同,但是他们共用一个实体。
深拷贝(deep copy):
对对象实例中字段引用的对象也进行拷贝。

好了,基于以上,我们再来看一个例子:

例2:

#encoding=utf-8
#
#by panda
#原型模式 

import copy 

def printInfo(info):
  print unicode(info, 'utf-8').encode('gbk') 

#拷贝接口
class ICloneable:
  def shallowClone(self):
    return copy.copy(self) 

  def deepClone(self):
    return copy.deepcopy(self) 

#工作经历
class WorkExperience(ICloneable):
  workData = ""
  company = ""
  pass 

#简历
class Resume(ICloneable):
  name = ""
  sex = '未知'
  age = 0
  work = None 

  def __init__(self, name, work = WorkExperience()):
    self.name = name
    self.work = work; 

  def setPersonInfo(self, sex, age):
    self.sex = sex
    self.age = age 

  def setWorkExperience(self, workData, company):
    self.work.workData = workData
    self.work.company = company   

  def display(self):
    printInfo('%s, %s, %d' % (self.name,self.sex,self.age))
    printInfo('%s, %s' % (self.work.workData, self.work.company)) 

def clientUI():
  a = Resume('大鸟')
  a.setPersonInfo('男',29)
  a.setWorkExperience("1998-2000","XX公司")   

  #浅拷贝
  b = a.shallowClone()
  b.setWorkExperience("2000-2006","YY公司")     

  #深拷贝
  c = a.deepClone()
  c.setWorkExperience("2006-2009","ZZ公司")   

  b.display()
  a.display()
  c.display()
  return 

if __name__ == '__main__':
  clientUI();
(0)

相关推荐

  • 举例讲解Python设计模式编程的代理模式与抽象工厂模式

    代理模式 Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供'代理'的方式方式访问.比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介 你先设想:一个对象提供rgb三种颜色值,我想获得一个对象的rgb三种颜色,但是我不想让你获得蓝色属性,怎么办? class Proxy(object): def __init__(self, subject): self.__subject = subject # 代理其实本质上就是属性的委托 def _

  • 使用Mixin设计模式进行Python编程的方法讲解

    Mixin模式是一种在python里经常使用的模式,适当合理的应用能够达到复用代码,合理组织代码结构的目的. Python的Mixin模式可以通过多继承的方式来实现, 举例来说,我们自定义一个简单的具有嵌套结构的数据容器: class SimpleItemContainer(object): def __init__(self, id, item_containers): self.id = id self.data = {} for item in item_containers: self.

  • 详解设计模式中的工厂方法模式在Python程序中的运用

    工厂方法(Factory Method)模式又称为虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,属于类的创建型模式.在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实体化哪一个类. 在简单工厂模式中,一个工厂类处于对产品类进行实例化的中心位置上,它知道每一个产品类的细节,并决定何时哪一个产品类应当被实例化.简单工厂模式的优点是能

  • Python设计模式之代理模式实例

    翻墙常用的方式就是使用代理(Proxy),其基本过程如下: 浏览器<-->代理服务器<-->服务器 如果浏览器请求不到服务器,或者服务器无法响应浏览器,我们可以设定将浏览器的请求传递给代理服务器,代理服务器将请求转发给服务器.然后,代理服务器将服务器的响应内容传递给浏览器.当然,代理服务器在得到请求或者响应内容的时候,本身也可以做些处理,例如缓存静态内容以加速,或者说提取请求内容或者响应内容做些正当或者不正当的分析.这种翻墙方式,就是设计模式中代理模式(Proxy Pattern)

  • Python设计模式之观察者模式实例

    关于设计模式中的观察者模式,定义如下(维基百科): 觀察者模式(有時又被稱為發布/訂閱模式)是軟體設計模式的一種.在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知.這通常透過呼叫各觀察者所提供的方法來實現.此種模式通常被用來實作事件處理系統.简单来说,一个被观察者有很多观察者,被观察者的状态的改变会引起所有观察者的响应操作. 那么我们用Python2.7来实现观察者模式. Python中的集合set 集合(set),类似于列表(list),但是它没有重

  • 实例解析Python设计模式编程之桥接模式的运用

    我们先来看一个例子: #encoding=utf-8 # #by panda #桥接模式 def printInfo(info): print unicode(info, 'utf-8').encode('gbk') #抽象类:手机品牌 class HandsetBrand(): soft = None def SetHandsetSoft(self, soft): self.soft = soft def Run(self): pass #具体抽象类:手机品牌1 class HandsetBr

  • 举例分析Python中设计模式之外观模式的运用

    应用特性: 在很多复杂而小功能需要调用需求时,而且这些调用往往还有一定相关性,即一调用就是一系列的. 结构特性: 把原本复杂而繁多的调用,规划统一到一个入口类中,从此只通过这一个入口调用就可以了. 代码结构示例: class ModuleOne(object): def Create(self): print 'create module one instance' def Delete(self): print 'delete module one instance' class Module

  • Python的设计模式编程入门指南

    有没有想过设计模式到底是什么?通过本文可以看到设计模式为什么这么重要,通过几个Python的示例展示为什么需要设计模式,以及如何使用. 设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板.设计模式不会绑定具体的编程语言.一个好的设计模式应该能够用大部分编程语言实现(如果做不到全部的话,具体取决于语言特性).最为重要的是,设计模

  • Python设计模式中单例模式的实现及在Tornado中的应用

    单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def __new__(cls, *args): if not isinstance(cls._instance, cls): cls._instance = super(Singleton, cls).__new__(cls, *args) return cls._instance 但是子类在继承后可以重写__new__以失去单例特性 class D(Singleto

  • 举例讲解Python设计模式编程中的访问者与观察者模式

    访问者模式 我觉得Visitor模式是在补修改已有程序结构前提下,通过添加额外的访问者完成对代码功能的拓展 为什么这样用?当你的类层次较多,在某层结构中增加新的方法,要是在基类上面添加或者变更,可能破坏原来的设计, 有兼容问题,所以只在需要的类上面动态添加. python的例子 这里是个构建车的例子,每个部件都有一个accept的方法接受我上面说的所谓'访问者',而这个访问者 以参数的方式传进来,但是其实他是一个含有一些功能的类的实例,它拥有很多个visit开头的方法对应不同的部件. 这样就不需

  • Python设计模式之单例模式实例

    注:使用的是Python 2.7. 一个简单实现 复制代码 代码如下: class Foo(object):    __instance = None    def __init__(self):        pass    @classmethod    def getinstance(cls):        if(cls.__instance == None):            cls.__instance = Foo()        return cls.__instance

随机推荐