1. ?? 模式定義
工廠方法模式 (Factory Method) 是創建模式的一種,也叫虛擬構造子 (Virture Constractor) 模式或多態性工廠 (Polymorphic Factory) 模式。
?????? 工廠方法模式定義一個抽象的對象創建類或接口,將實際的對象創建工作交給子類來實現。
2. ?? 模式介紹
2.1. 簡單類圖
?
2.2. 類圖對應示例代碼
2.2.1. 抽象產品: AbstractProduct
public interface AbstractProduct{
? public void printName();
}
2.2.2. 具體產品: ConcreteProduct1 和 ConcreteProduct2
public class ConcreteProduct1 implements AbstractProduct{
? public void printName(){
??? System.out.println(“ConcreteProduct
}
}
public class ConcreteProduct2 implements AbstractProduct{
? public void printName(){
??? System.out.println(“ConcreteProduct
}
}
2.2.3. 抽象工廠: AbstractFactory
public interface AbstractFactory {
? public AbstractProduct factoryMethod();
}
2.2.4. 具體工廠: ConcreteFactory1 和 ConcreteFactory2
public class ConcreteFactory1 implements AbstractFactory{
? public AbstractProduct factoryMethod(){
//do something.
return new ConcreteProduct1();
}
}
public class ConcreteFactory2 implements AbstractFactory{
? public AbstractProduct factoryMethod(){
//do something.
return new ConcreteProduct2();
}
}
3. ?? 模式特點
3.1. 開閉原則(優點)
工廠方法模式解決了簡單工廠模式的一些缺陷,是在簡單工廠模式的基礎上發展的。
簡單工廠模式把所有的重心放到工廠類上,一旦向系統增加新的產品,就必須修改工廠類,不滿足開閉原則;工廠方法模式提供一個抽象的工廠接口,在不同的產品結構上實現不同的產品工廠具體類來創建該層次中的產品,通常一個具體工廠創建一個具體產品。在新增產品的時候,只需要實現新的對應工廠就可以滿足需要,是符合開閉原則的。
3.2. 缺點
- 相比簡單工廠模式,工廠方法模式客戶端編程復雜,每個產品的創建都需要實例化對應的工廠類。
- 相對的擴展性,當需要修改產品結構中的對各產品的時候,需要修改各個工廠(當然也可以直接新加入很多新的產品和工廠,但這樣不是又增加了很多無用的遺留類嗎,而且現實中很可能要修改客戶端代碼了。),而簡單工廠模式仍然只要修改一個工廠類。
- 現實中常常要使用退化模式,失去多態性。實際設計中經常會有子類新增功能,那么在對應工廠生產該類的時候就需要直接返回該具體類,而不是抽象產品,不然就要向下轉型了。
4. ?? 與其它模式的關系
工廠方法模式與模板模式
5. ?? 參考
《 java 設計模式》 閻宏 電子工業出版社