設計模式學習筆記(五) 工廠方法模式

2021-10-08 03:29:40 字數 2473 閱讀 2762

2 典型實現

3 例項

4 隱藏

5 主要優點

6 主要缺點

7 適用場景

8 總結

儘管簡單工廠模式實現了物件的建立和使用分離,但是仍然存在以下兩個問題:

乙個更好的辦法是使用工廠方法模式。

工廠方法模式:定義乙個用於建立物件的介面,讓子類決定將哪乙個類例項化。

工廠方法又簡稱工廠模式或虛擬構造器模式或多型工廠模式,讓乙個類的例項化延遲到其子類,是一種類建立型模式。

這裡定義為介面:

inte***ce

product

兩個示例具體產品:

class

concreteproducta

implements

product

}class

concreteproductb

implements

product

}

這裡定義為介面:

inte***ce

factory

抽象工廠中宣告了工廠方法但沒有實現,交由子類具體工廠負責。

class

concretefactorya

implements

factory

}class

concretefactoryb

implements

factory

}

乙個具體產品對應乙個具體工廠,每乙個具體工廠返回不同的具體產品。

客戶端針對抽象產品以及抽象工廠進行程式設計,無需知道具體產品的類名,只需要知道具體產品對應的工廠,即可獲取具體產品:

factory factory =

newconcretefactorya()

;product product = factory.

get();

product.

method()

;factory =

newconcretefactoryb()

;product = factory.

get();

product.

method()

;

日誌記錄器的設計:該記錄器可以通過多種途徑儲存系統的執行日誌,例如檔案記錄或者資料庫記錄,使用工廠方法模式進行設計。

設計如下:

**如下:

public

class

test

}//抽象產品

inte***ce

logger

//具體產品:databaselogger

class

databaselogger

implements

logger

}//具體產品:filelogger

class

filelogger

implements

logger

}//抽象工廠

inte***ce

logge***ctory

//具體工廠:databaselogge***ctory

class

databaselogge***ctory

implements

logge***ctory

}//具體工廠:filelogge***ctory

class

filelogge***ctory

implements

logge***ctory

}

可以把抽象工廠設定為抽象類,工廠方法直接可以對客戶端隱藏,也就是說可以直接通過抽象工廠呼叫具體產品類的業務方法,客戶端無需建立具體產品,直接通過工廠類呼叫即可,**修改如下(抽象產品以及具體產品類不用修改):

//抽象工廠

abstract

class

logge***ctory

public

abstract logger createlogger()

;}//具體工廠:databaselogge***ctory

class

databaselogge***ctory

extends

logge***ctory

}//具體工廠:filelogge***ctory

五 工廠方法模式 設計模式學習筆記

1 抽象工廠角色 是工廠方法模式的核心,與應用程式無關。任何在模式中建立的物件的工廠類必須實現這個介面。2 具體工廠角色 這是實現抽象工廠介面的具體工廠類,包含於應用程式密切相關的邏輯,並且受到應用程式呼叫以建立產品物件。3 抽象產品角色 工廠方法模式所建立的物件的超型別,也就是產品物件的共同父類或...

C 設計模式學習筆記五 工廠方法模式

工廠方法模式 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,工廠方法使乙個類的例項化延遲到其子類。工廠方法模式在專案中使用得非常頻繁,以至於很多 中都包含工廠方法模式。該模式幾乎盡人皆知,但不是每個人都能用得好。熟能生巧,熟練掌握該模式,多思考工廠方法如何應用,而且工廠方法模式還可以與其他模...

設計模式(五) 工廠方法模式

工廠方法模式,定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類。我們依舊以之前的電腦程式來闡述工廠方法模式 不了解簡單工廠的童鞋戳這裡 1.如下 using system namespace factorymethod set public double n...