原型模式(PrototypePattern)定义“指定使用原型实例创建的对象种类,并通过复制此原型来创建新对象,并通过复制这些原型来创建新对象.)》《设计模式之禅》原型模式可以减少新对象的创建,减少性能损失。原型模式直接执行二进制文件的内存复制。而当多个访问者需要修改同一个对象时可以使用原型模式,可以通过原型模式复制多个部分来修改对象。UML实例由于原型模式是一个对象的拷贝,对于python,可以执行copy.copy()copy.deepcopy()函数来实现原型模式。这很简单。为什么可以说重要的是掌握原型模式的应用场景才是最重要的。来自集合的代码实现importOrderedDictimportcopyclassBook:def__init__(self,name,authors,price,**rest):self.name=nameself.authors=authorsself.price=priceself.__dict__.update(rest)super().__init__()def__str__(self):'''__str__函数是object定义的函数,用来执行print是打印字符串时的输出结果'''mylist=[]#OrderDict有序字典,根据插入order对字典进行排序,一个很有用的库函数[i]))ifi=='price':mylist.append('$')mylist.append('\n')return''.join(mylist)classPrototype:'''实现一个通用原型类,你可以存储各种类型的__dict__信息,但你需要一个标识符作为唯一标识符'''def__init__(self):self.objects=dict()defregister(self,identifier,obj):self.objects[identifier]=objdefunregister(self,identifier):delself.objects[identifier]defclone(self,identifier,**attr):found=self.objects.get(identifier)如果没有找到:raiseValueError('Incorrectobjectidentifier:{}'.format(identifier))obj=copy.deepcopy(found)obj.__dict__.update(attr)returnobjdefmain():b1=Book('TheCProgrammingLanguage',('BrianW.Kernighan','DennisM.Ritchie'),price=118,publisher='PrenticeHall',length=228,publication_date='1978-02-22',tags=('C','programming','algorithms','数据结构'))prototype=Prototype()cid='k&r-first'#第一本书对象的唯一标识,方便cloneprototype.register(cid,b1)#注册一本书#通过clone方法复制书b2b2=prototype.clone(cid,name='TheCProgrammingLanguage(ANSI)',price=48.99,length=274,publication_date='1988-04-01',edition=2)foriin(b1,b2):print(i)print('IDb1:{}!=IDb2:{}'.format(id(b1),id(b2)))if__name__=="__main__":main()知识点没有太难的知识点原型模式,我们只需要关注pythcopy.copy()和copy.deepcopy()中的copy.copy()浅拷贝,依赖于引用;我们可以引入数据共享和写时复制等技术来优化性能(例如,减少克隆对象的创建时间)和内存使用。copy.deepcopy()深拷贝,深拷贝就是将原始对象的所有数据简单复制到克隆对象中,无一例外。解释是如果复制的数据中包含引用对象的内容,浅拷贝不会复制一个对象,而是复制对象的引用值,减少复制的循环。深拷贝会重新拷贝一个对象,并存储新对象的地址。下一集预览(适配器模式)
