Python之工廠模式

2022-09-08 02:45:10 字數 4744 閱讀 8552

工廠模式(factory pattern)是最常用的設計模式之一,這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用乙個共同的介面來指向新建立的物件。

意圖:定義乙個建立物件的介面,讓其子類自己決定例項化哪乙個工廠類,工廠模式使其建立過程延遲到子類進行。

主要解決:主要解決介面選擇的問題。

何時使用:我們明確地計畫不同條件下建立不同例項時。

統一使用乙個類作為對外介面,根據引數的不同,去選擇例項化不同的類。

"""

兩個產品(兩種型別的書)

"""class

technicalbooks(object):

"""技術書籍

"""def

publish(self):

return

"python-book

"class

literarybooks(object):

"""文學書籍

"""def

publish(self):

return

"black hole book"#

現在我們有兩種型別的書,分別是technicalbooks和literarybooks的書

#按照我們平常的方法來例項化的話,此時建立物件時是會對客戶端暴露真正建立的類

it_books =technicalbooks()

ly_books =literarybooks()

#這時我們就可以構造乙個"簡單工廠"把所有例項化的過程封裝在裡面,把真正例項的類隱藏起來

class

******factory(object):

"""簡單工廠

"""@staticmethod

defpublish_book(name):

if name == '

technical':

return

technicalbooks()

elif name == '

literary':

return

literarybooks()

it_books2 = ******factory.publish_book('

technical')

ly_books2 = ******factory.publish_book('

literary

')

簡單工廠的好處在於,把不同類的例項化統一到乙個"工廠",即不對外暴露真正的建立類,也提供了乙個對外的統一介面。

但是簡單工廠也有乙個缺點,那就是違背了solid的 "開閉原則",假如我們還需要增加一種書籍,那就必須要對簡單工廠******factory進行原始碼的修改,

簡單工廠使用場景:

例如:某個系統,已經明確就只會有mysql、redis、mongodb三個資料庫的情況下,可以直接使用簡單工廠模式。

上面的簡單工廠我們已經知道了,如果新增一些型別的時候會違背軟體設計中的開閉原則,但是我們希望在擴充套件新的類時,不要修改原有的**。這個時候我們可以在簡單工廠的基礎上把******factory抽象成不同的工廠,每個工廠對應生成自己的產品,這就是工廠方法。

"""

兩個產品(兩種型別的書)

"""import

abc#

真正進行例項化的類

class

technicalbooks(object):

"""技術書籍

"""def

publish(self):

return

"python-book

"class

literarybooks(object):

"""文學書籍

"""def

publish(self):

return

"black hole book"#

抽象工廠:先定義抽象類,然後每種型別的書籍都有自己對於的工廠

class abstractfactory(metaclass=abc.abcmeta):

"""抽象工廠

"""@abc.abstractmethod

defpublish_book(self):

pass

class

technicalfactory(abstractfactory):

"""技術書籍工廠

"""def

publish_book(self):

return

technicalbooks()

class

literaryfactory(abstractfactory):

"""文學書籍工廠

"""def

publish_book(self):

return

literarybooks()

it_books2 =technicalfactory().publish_book()

ly_books2 = literaryfactory().publish_book()

這樣每個工廠就只負責生產自己的產品,避免了在新增產品時需要修改工廠的**,遵循了"開閉原則",如果需要新增產品時,只需要增加相應的工廠即可。

比如要新增一種**型別的書籍,只需新增乙個novelbooks類和novelfactory類。

工廠方法的使用場景

在工廠方法中,使用者不需要知道具體的產品類名,只需要知道其對應的工廠即可。

工廠方法解決了"開閉原則"的問題,但是我們出版書籍之前肯定還會有其他的步驟,比如印刷。

如果每乙個步驟我們就要寫乙個對應的工廠類,那我們就會需要建立很多很多類了。

因此為了解決這個問題,我們就要需要抽象工廠類,讓乙個工廠可以生產同一類的多個產品或多個動作(步驟),這就是抽象工廠。

"""

兩個產品(兩種型別的書)

"""import

abc#

印刷書籍

class

printingtechnicalbooks(object):

"""印刷技術書籍

"""def

printing(self):

return

"print-python-book

"class

printingliterarybooks(object):

"""印刷文學書籍

"""def

printing(self):

return

"print black hole book"#

出版書籍

class

technicalbooks(object):

"""出版技術書籍

"""def

publish(self):

return

"python-book

"class

literarybooks(object):

"""出版文學書籍

"""def

publish(self):

return

"black hole book"#

抽象工廠:先定義抽象類,然後每種型別的書籍都有自己對於的工廠

class abstractfactory(metaclass=abc.abcmeta):

"""抽象工廠

"""@abc.abstractmethod

defprint_book(self):

pass

@abc.abstractmethod

defpublish_book(self):

pass

class

technicalfactory(abstractfactory):

"""技術書籍工廠

"""def

print_book(self):

return

printingtechnicalbooks()

defpublish_book(self):

return

technicalbooks()

class

literaryfactory(abstractfactory):

"""文學書籍工廠

"""def

print_book(self):

return

printingliterarybooks()

defpublish_book(self):

return

literarybooks()

#例項化工廠物件

it =technicalfactory()

ly =literaryfactory()

#印刷書籍

it_print =it.print_book()

ly_print =ly.print_book()

#出版書籍

it_publish =it.publish_book()

ly_publish = ly.publish_book()

抽象工廠模式與工廠方法模式的區別:

抽象工廠中的乙個工廠物件可以負責多個不同產品物件的建立 

抽象工廠的使用場景

Python設計模式之工廠模式

工廠模式,可以理解為建立乙個工廠 類 這個工廠會根據你的需求 輸入 生產出 輸出 你想要的產品 物件 簡單說就是工廠類會根據你的輸入給你返回恰當的物件。class shape staticmethod deffactory shape if shape square return square if...

python設計模式之工廠模式

from abc import abcmeta,abstractmethod class coke metaclass abcmeta abstractmethod defdrink self pass class coca coke defdrink self print drink coca c...

python學習 設計模式之 工廠模式

一 工廠模式運用場景 若需要將物件的建立和使用解耦,工廠方法也能派上用場。工廠方法可以在必要時建立新的物件,從而提高效能和記憶體使用率。二 工廠模式案例 import xml.etree.elementtree as etree import json class jsonconnector def...