原型模式設計模式
原型設計模式幫助咱們建立對象的克隆,其最簡單的形式就是一個clone()函數,接受一個對象做爲輸入參數,返回輸入對象的一個副本。在Python中,這可使用copy.deepcopy()函數來完成。
現實生活中的例子:有絲分裂,即細胞分裂的過程,是生物克隆的一個例子。在這個過程當中,細胞核分裂產生兩個新的細胞核,其中每一個都有與原來細胞徹底相同的染色體和DNA內容。
import copy from collections import OrderedDict class Book: def __init__(self,name,authors,price,**rest): """rest的例子有:出版商、長度、標籤、出版日期""" self.name = name self.authors = authors self.price = price self.__dict__.update(rest) def __str__(self): mylist = [] #由於咱們未知全部被添加參數的名稱,但又須要訪問內部字典將這些參數應用到__str__()中 #且字典無序,全部利用Ordereddict來強制元素有序,不然,每次打印結果會有所不一樣。 ordered = OrderedDict(sorted(self.__dict__.items())) for i in ordered.keys(): mylist.append('{}:{}'.format(i,ordered[i])) if i=='price': mylist.append('$') mylist.append('\n') return ''.join(mylist) #Prototype實現了原型設計模式,其核心是clone()方法 class Prototype: def __init__(self): self.objects = dict() def register(self,identifier,obj): self.objects[identifier] = obj def unregister(self,identifier): del self.objects[identifier] def clone(self,identifier,**attr): found = self.objects.get(identifier) if not found: raise ValueError('Incorrect object identifier:{}'.format(identifier)) obj = copy.deepcopy(found) obj.__dict__.update(attr) return obj def main(): b1 = Book("The C Programming Language",("Brain W. Kerbighan","Dennis M'Rithchie"),price = 118, publisher="Prentice Hall",length=228,publication_date="1978-02-22", tags=('C','programming','algorithms')) prototype = Prototype() cid = "k&r-first" prototype.register(cid,b1) b2 = prototype.clone(cid,name="The C Programming Language(ANSI)",price=48.99, length=274,publication_date='1988-04-01',edition=2) for i in (b1,b2): print(i) print("ID b1:{} != ID b2:{}".format(id(b1),id(b2))) if __name__ == '__main__': main()
小結性能優化
原型模式用於建立對象的徹底副本。確切的說,建立一個對象的副本能夠指代如下兩件事情。
當建立一個淺副本時,副本依賴引用;
當建立一杯深副本時,副本複製全部東西。
第一種狀況中,咱們關注提高性能優化和優化內存使用,在對象之間引入數據共享,但須要當心地修改數據,由於全部變動對全部副本都是可見的。
第二種狀況中,咱們但願可以對一個副本進行更改而不會影響其餘對象。