建立型模式---原型模式

原型模式設計模式

原型設計模式幫助咱們建立對象的克隆,其最簡單的形式就是一個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()

小結性能優化

原型模式用於建立對象的徹底副本。確切的說,建立一個對象的副本能夠指代如下兩件事情。
    當建立一個淺副本時,副本依賴引用;
    當建立一杯深副本時,副本複製全部東西。
第一種狀況中,咱們關注提高性能優化和優化內存使用,在對象之間引入數據共享,但須要當心地修改數據,由於全部變動對全部副本都是可見的。
第二種狀況中,咱們但願可以對一個副本進行更改而不會影響其餘對象。
相關文章
相關標籤/搜索