Java與模式學習筆記 —— 簡單工廠模式
技術標籤:Java與模式學習筆記java
簡單工廠模式是類的建立模式,又叫做靜態工廠方法(Static Factory Method)模式。
簡單工廠模式是由一個工廠物件決定創建出哪一種產品類的例項。
一、結構
簡單工廠模式就是由一個工廠類根據傳入的參量決定創建出哪一種產品類的例項。
- 工廠類(Creator)角色:擔任這個角色的是工廠方法模式的核心,含有與應用緊密相關的商業邏輯。工廠類在客戶端的直接呼叫下建立產品物件,它往往由一個具體Java類實現。
- 抽象產品(Product)角色:擔任這個角色的類是由工廠方法模式所建立的物件的父類,或它們共同擁有的介面。抽象產品角色可以用一個Java介面或者Java抽象類實現。
- 具體產品(Concrete Product)角色:工廠方法模式所建立的任何物件都是這個角色的例項,具體產品角色由一個具體Java類實現。
/* Creator類原始碼 */
public class Creator {
public static Product factory() {
return new ConcreteProduct();
}
}
/* Product介面原始碼 */
public interface Product{}
/* ConcreteProduct類原始碼 */
public class ConcreteProduct implements Product {
public ConcreteProduct() {}
}
二、實現
抽象產品角色的省略
如果系統僅有一個具體產品角色的話,那麼就可以省略掉抽象產品角色。
public class Creator {
public static ConcreteProduct factory() {
return new ConcreteProduct();
}
}
public class ConcreteProduct {
public ConcreteProduct() {}
}
三個角色全部合併
如果抽象產品角色已經被省略,而工廠角色就可以與具體產品角色合併。換言之,一個產品類為自身的工廠。
顯然,三個原本獨立的角色:工廠角色、抽象產品以及具體產品角色都已經合併成為一個類,這個類自行建立自己的例項。
public class ConcreteProduct {
public ConcreteProduct() {}
public static ConcreteProduct factory() {
return new ConcreteProduct();
}
}
三、優缺點
優點:
模式的核心是工廠類,決定建立哪一個產品類的例項。而客戶端免除直接建立產品物件的責任而僅僅負責“消費”產品。實現了對責任的分割。
缺點:
當產品類有複雜的多層次等級結構時,工廠類只有它自己,在何時建立哪一種產品的判斷邏輯混合在一起,使得系統在將來進行功能擴充套件時較為困難。這一缺點在工廠方法模式中得到克服。
簡單工廠模式的工廠角色無法形成基於繼承的等級結構,因為靜態方法無法由子類繼承,而簡單工廠模式是使用靜態方法作為工廠方法的。
“開-閉原則”
“開-閉”原則要求一個系統的設計能夠允許系統在無需修改的情況下,擴充套件其功能。
一個系統總是可以劃分成為產品的消費者角色(Client)、產品的工廠角色(Factory)以及產品角色(Product)三個子系統。
在這個系統中,功能的擴充套件體現在引進新的產品上。“開-閉”原則對於產品的消費角色是成立的,而對於工廠角色是不成立的。
對於產品消費角色來說,任何時候需要某種產品,只需向工廠角色請求即可。而工廠角色在接到請求後,會自行判斷建立和提供哪一個產品。所以消費角色無需知道它得到的是哪一種產品;換言之,產品消費角色無需修改就可以接納新的產品。
對於工廠角色來說,增加新的產品需要知道每一種產品,如何建立它們以及何時向客戶端提供它們;換言之,接納新的產品意味著修改這個工廠角色的原始碼。