Python設計模式4 原型模式

2021-09-23 10:31:25 字數 1903 閱讀 9956

原型模式,也是用於建立物件時的一種設計方法。

主要應用場景是:每次初始化某個物件時,需要傳遞大量的引數,很不方便,此時,可以使用原型模式,在已經建立並初始化的物件基礎上,可以快速而又方便建立新的不同物件。

主要原理:使用深拷貝,複製乙個已建立的物件,然後使用__dict__.update()方法更新已建立物件中的引數值方式建立新物件。

背景知識:在python中的類中,__dict__是乙個字典,儲存了所有該類中的變數,函式等引數。

#coding=utf-8

import copy

from collections import ordereddict

class book(object):

def __init__(self,name,authors,price,**rest):

self.name = name

self.authors = authors

self.price = price

self.__dict__.update(rest)

def __str__(self):

mylist=

ordered=ordereddict(sorted(self.__dict__.items()))

for i in ordered.keys():

if i=='price':

return ''.join(mylist)

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) #這裡不能寫成obj.update(attr),深度拷貝的物件中沒有這個update()函式

return obj

if __name__ == "__main__":

b1 = book('the c programming language', ('brian w. kernighan', 'dennis m.ritchie'),

price=118, publisher='prentice hall', length=228, publication_date='1978-02-22',

tags=('c', 'programming', 'algorithms', 'data structures'))

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)))

設計模式4 原型模式

通過實現cloneable介面,並重寫父類 即object 的clone方法來返回和該物件一模一樣的物件來實現例項化乙個新物件的效果。比較官方的解釋是 用原型例項指定建立物件的種類,並且通過拷貝這些原型來建立新的物件。public class prototype implements cloneab...

python 設計模式 原型模式 原型設計模式

原型設計模式有助於隱藏該類建立例項的複雜性,在物件的概念將與從頭建立的新物件的概念不同。如果需要,新複製的物件可能會在屬性中進行一些更改。這種方法節省了開發產品的時間和資源。如何實現原型模式?現在讓我們看看如何實現原型模式。實現如下 import copy class prototype type ...

Java設計模式4 原型模式

原型模式是一種建立型設計模式,它通過複製乙個已經存在的例項來返回新的例項,而不是新建例項.被複製的例項就是我們所稱的原型,這個原型是可定製的.說白了就是乙個類實現了cloneable,重寫clone方法,就可以呼叫這個類的物件複製例項了。1 拷貝分類 原型模式中的拷貝分為 淺拷貝 和 深拷貝 淺拷貝...