sunny公司開發人員通過進一步分析,發現可以通過多種方式來初始化日誌記錄器,例如可以為各種日誌記錄器提供預設實現;還可以為資料庫日誌記錄器提供資料庫連線字串,為檔案日誌記錄器提供檔案路徑;也可以將引數封裝在乙個object型別的物件中,通過object物件將配置引數傳入工廠類。此時,可以提供一組過載的工廠方法,以不同的方式對產品物件進行建立。當然,對於同乙個具體工廠而言,無論使用哪個工廠方法,建立的產品型別均要相同。如圖4所示:
引入過載方法後,抽象工廠logge***ctory的**修改如下:
inte***ce logge***ctory
具體工廠類databaselogge***ctory**修改如下:
class
databaselogge***ctory
implements
logge***ctory
public logger createlogger(string args)
public logger createlogger(object obj)
}//其他具體工廠類**省略
在抽象工廠中定義多個過載的工廠方法,在具體工廠中實現了這些工廠方法,這些方法可以包含不同的業務邏輯,以滿足對不同產品物件的需求。
有時候,為了進一步簡化客戶端的使用,還可以對客戶端隱藏工廠方法,此時,在工廠類中將直接呼叫產品類的業務方法,客戶端無須呼叫工廠方法建立產品,直接通過工廠即可使用所建立的物件中的業務方法。
如果對客戶端隱藏工廠方法,日誌記錄器的結構圖將修改為圖5所示:
在圖5中,抽象工廠類logge***ctory的**修改如下:
//改為抽象類
abstract class logge***ctory
public
abstract logger createlogger();
}
客戶端**修改如下:
class
client
}
通過將業務方法的呼叫移入工廠類,可以直接使用工廠物件來呼叫產品物件的業務方法,客戶端無須直接使用工廠方法,在某些情況下我們也可以使用這種設計方案。
工廠方法模式是簡單工廠模式的延伸,它繼承了簡單工廠模式的優點,同時還彌補了簡單工廠模式的不足。工廠方法模式是使用頻率最高的設計模式之一,是很多開源框架和api類庫的核心模式。
1、 主要優點
(1) 在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。
(2)基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠讓工廠可以自主確定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多型工廠模式,就正是因為所有的具體工廠類都具有同一抽象父類。
(3) 使用工廠方法模式的另乙個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增乙個具體工廠和具體產品就可以了,這樣,系統的可擴充套件性也就變得非常好,完全符合「開閉原則」。
2、 主要缺點
(1) 在新增新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷。
(2) 由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端**中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到dom、反射等技術,增加了系統的實現難度。
3、 適用場景
工廠三兄弟之工廠方法模式(四)
sunny公司開發人員通過進一步分析,發現可以通過多種方式來初始化日誌記錄器,例如可以為各種日誌記錄器提供預設實現 還可以為資料庫日誌記錄器提供資料庫連線字串,為檔案日誌記錄器提供檔案路徑 也可以將引數封裝在乙個object型別的物件中,通過object物件將配置引數傳入工廠類。此時,可以提供一組過...
工廠三兄弟之工廠方法模式(四)
sunny公司開發人員通過進一步分析,發現可以通過多種方式來初始化日誌記錄器,例如可以為各種日誌記錄器提供預設實現 還可以為資料庫日誌記錄器提供資料庫連線字串,為檔案日誌記錄器提供檔案路徑 也可以將引數封裝在乙個object型別的物件中,通過object物件將配置引數傳入工廠類。此時,可以提供一組過...
工廠三兄弟之工廠方法模式(一)
簡單工廠模式雖然簡單,但存在乙個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的源 將違背 開閉原則 如何實現增加新產品而不影響已有 工廠方法模式應運而生,本文將介紹第二種工廠模式 工廠方法模式。1 日誌記錄器的設計 sunny軟體公...