設計模式系列之三:工廠模式(Factory Pattern)
阿新 • • 發佈:2019-02-17
這是本系列的第三篇部落格,這次主要來說一下工廠模式。
基本工廠模式
簡單來說工廠模式是將工程中的相同型別物件的建立活動集中管理,一般通過反射來生成外界需要的實體類。比如Spring中的容器Bean概念,通過Spring BeanFactory來產生不同的Bean
這樣做有兩個好處:
1. 便於之後的實體類的拓展性
2. 可以方便的進行不同實體類的具體初始化(Init)方案
我們這裡來用一個水果店來說明這個設計模式的大體思路:
- 水果店中售賣的水果是一系列相似的產品
- 這些產品都是可以被購買的(相似的行為抽象介面)
- 水果店是可以售賣當前所有的水果的(工廠可以產生這一系列產品實體類)
那麼我們來定義水果的interface
/**
* Created by youweixi on 15/12/5.
* 水果介面
*/
public interface Fruit {
void sell();
}
蘋果實體類:
/**
* Created by youweixi on 15/12/5.
* 蘋果實體類
*/
public class Apple implements Fruit{
@Override
public void sell() {
System.out.println("Sell One Apple");
}
}
香蕉和梨略
現在來構建一個工廠類,我們這裡因為用不到抽象工廠類,所以只需要建立一個實體類即可,這個實體類可以通過反射來生成指定的實體類。
/**
* Created by youweixi on 15/12/5.
* 水果店工廠類
*/
public class FruitFactory {
public static Fruit createFruit(String className){
try {
return (Fruit) Class.forName(className).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
測試:
public static void main(String[] args){
createFruit("com.bigtomato.programodel.factory.Apple").sell();
createFruit("com.bigtomato.programodel.factory.Pear").sell();
createFruit("com.bigtomato.programodel.factory.Banana").sell();
}
Sell One Apple
Sell One Pear
Sell One Banana
抽象工廠模式
所謂的抽象工廠模式只不過是在應對多種系列商品的一種工廠模式。說簡單點就是所有的工廠共同實現一個工廠介面或者繼承某個工廠基類,在此不再贅述了。
總結
工廠類說到底,其實沒有避免物件的建立操作,但是一般來說,工廠類和其他設計模式結合才能進一步優化軟體設計思路。
- 工廠類和例項池結合可以實現限制當前環境中的例項個數(如一些資料庫連線池,每次請求的例項其實是直接從空閒連線中取出,這樣的速度會很快,使用完畢之後會返回給工廠)
- 工廠類可以初始化不同的例項物件,這點可以降低程式程式碼冗餘度,使從工廠中獲取到的物件都按照一定的標準進行了初始化(有興趣的同學可以參看一下Spring Bean 中的Bean初始化方式)