學習筆記02 工廠方法模式

2021-08-26 02:14:51 字數 2816 閱讀 4484

以下幾點能幫助理解工廠方法模式:

定義乙個介面來建立物件,但是工廠本身並不負責建立物件,而是將這一任務交由子類來完成,即子類決定了要例項化哪些類

factory方法的建立是通過繼承而不是通過例項化來完成的

工廠方法使設計更加具有可定製性。它可以返回相同的例項或子類,而不是某種型別的物件。

ps:可以理解為,工廠方法模式中,工廠提供零件和組裝零件的方法,至於組裝成什麼產品,由子類自定義

如下uml圖中,有乙個包含factorymethod()方法的抽象類creator,factorymethod()方法建立指定型別的物件。concretecreator類提供了乙個實現creator抽象類的factorymethod()方法,這種方法可以在執行時修改已建立的物件。concretecreator建立concreteproduct,並確保其建立的物件實現了product類,同時為product介面中的所有方法提供相應的實現。

拿乙個現實世界的場景做例子。假設我們想在不同型別的社交網路(例如linkedin,facebook等)上為個人或公司建立簡介。那麼,每個簡介都有某些特定的組成章節。在linkedin的簡介中,有乙個章節是關於個人申請的專利或出版社作品的。在facebook上,你將在相簿看到最近度假地點的**區。此外,在兩個簡介中,都有乙個個人資訊區。簡而言之,我們要通過將正確的區新增到相應的簡介中來建立不同型別的簡介。

from abc import abcmeta, abstractmethod

class section(metaclass=abcmeta):

@abstractmethod

def describe(self):

pass

class personalsection(section):

def describe(self):

print('personal section')

class albumsection(section):

def describe(self):

print('album section')

class patentsection(section):

def describe(self):

print('patent section')

class publicationsection(section):

def describe(self):

print('publication section')

# creator

class profile(metaclass=abcmeta):

def __init__(self):

self.sections =

self.createprofile()

# factorymethod()

@abstractmethod

def createprofile(self):

pass

def getsections(self):

return self.sections

def addsections(self, section):

# concretecreator

class linkedin(profile):

def createprofile(self):

self.addsections(personalsection())

self.addsections(patentsection())

self.addsections(publicationsection())

# concretecreator

class facebook(profile):

def createprofile(self):

self.addsections(personalsection())

self.addsections(albumsection())

if __name__ == '__main__':

profile_type = input('which profile you would like to create? [linkedin or facebook]')

profile = eval(profile_type.lower())()

print('creating profile...', type(profile).__name__)

print('profile has sections --', profile.getsections())

首先,建立乙個section抽象類,提供乙個抽象方法describe(),然後建立personalsecton, albumsection, patentsection和publicationsection類,這些類用於實現describe()方法。接著,建立乙個profile抽象類(creator),提供乙個工廠方法(factorymethod)即createprofile()。再建立兩個concretecreator類即linkedin和facebook,每個類都實現了createprofile()方法,此方法可以在執行時建立多個concreteproducts

具有更強大的靈活性,使得**更加通用,因為它不是單純的例項化某個類。

松耦合,因為建立物件的**與使用它的**是分開的。客戶端完全不用關心傳遞哪些引數以及需要例項化哪些類。由於新增新類更加容意,所以降低了維護成本。

02 工廠方法模式

1.什麼是工廠方法模式 工廠方法模式同樣屬於類的建立型模式又被稱為多型工廠模式 工廠方法模式的意義是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以...

02 工廠方法模式

結構 product 抽象產品 它是定義產品的介面,是工廠方法模式所建立物件的超型別,也就是產品物件的公共父類。concreteproduct 具體產品 它實現了抽象產品介面,某種型別的具體產品由專門 的具體工廠建立,具體工廠和具體產品之間一對應。factory 抽象工廠 在抽象工廠類中宣告了工廠方...

工廠方法模式 工廠方法模式

工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...