Python的建立型設計模式之原型模式與單例模式

2021-07-30 05:54:01 字數 1750 閱讀 4959

原型模式,使用的情景:是想根據現有的物件複製出新的物件並對其修改。

這裡的舉例,是以平面上的點為類,進行原型模式的演示

class point:

def __init__(self, x, y):

self.x = x

self.y = y

point1 = point(1, 2)

point2 = eval("{}({},{})".format("point", 2, 4))

point3 = getattr(sys.modules[__name__], "point")(2, 5)

point4 = globals()["point"](3, 4)

point5 = make_object(point, 10, 20)

point6 = copy.deepcopy(point5)

point6.x = 9

point6.y = 10

point7 = point1.__class__(30, 50)

point類,可以看到是很基礎的乙個類,x , y 兩個座標屬性

1不用說了,很經典的例項化

2使用了 eval() ,在之前的工廠模式裡面是見到了,現在明白了()裡面的括號,它就相當於 point1

3,4都是使用了內建函式 getattr 和 globals 來進行建立

5使用 make_object() 

6使用copy

以上2-6都是借助了函式來完成

7呢,可以著重來看看,它是對 point1 進行了修改,而就變成了另乙個新的物件 point7。效率是能提高。

單例模式,使用情景:整個程式的執行過程中,某個類只應該出現乙個例項。

python 中有 singleton 類和  brog 類來實現單例模式,但是現在要看的實現方式是:

把全域性狀態放在私有變數中,並且提供用於訪問此變數的公開函式。

這裡的舉例是:

寫乙個函式

返回含有貨幣匯率的字典

這個函式會被多次使用

但是匯率資料只需獲取一次就夠了

# 這是rate類的乙個屬性

_url = "*********x"

def get(refresh=false):

if refresh:

get.rates = {}

if get.rates:

return get.rates

with urllib.request.urlopen(_url) as file:

for line in file:

line = line.rstrip().decode("utf-8")

if not line or line.startwith(("#", "date")):

continue

name, currency, *rest = re.split(r"\s*,\s*", line)

key = "{}({})".format(name, currency)

try:

get.rates[key] = float(rest[-1])

except valueerror as err:

print "error"

return get.rates

get.rates = {}

總的來說,原型模式和單例模式都是次的,最有用的是抽象工廠,工廠方法和建造者模式。

下一階段就到創造好基本的物件之後,該怎麼繼續呢?

建立型設計模式之

單例模式保證了乙個類的例項的全域性唯一性。餓漢模式的單例模式 public class singleton 構造方法私有 private static singleton singleton new singleton 在類內部建立例項物件 public static singleton getsi...

設計模式之工廠模式(建立型)

什麼是設計模式?每乙個模式描述了我們周圍不斷重 生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重複勞動。1.簡單工廠 factory 當看到 new 時,就會想到 具體 pizza pizza new cheesepizza 當有很多種pizza時,我們需要用選擇語...

建立型設計模式之build模式

最近在讀 設計模式 可復用物件導向軟體設計的基礎 一書,在閱讀的過程中我會結合書中的相關知識和例項以及在網路上的部落格對相關的模式的理解進行總結,並在此基礎上加入自己的一些理解,總結模式中需要注意的一些點,記錄在此部落格,以供大家交流分享,同時防止自己對內容遺忘,如有不正確指出,歡迎批評指正。本節的...