GG請自己的女朋友和眾多美女吃飯,但是GG自己是不會做飯的或者做的飯很不好,這說明GG不用自己去創建各種食物的對象;各個美女都有各自的愛好,到麥當勞后她們喜歡吃什么直接去點就行了,麥當勞就是生產各種食物的工廠,這時候GG不用自己動手,也可以請這么多美女吃飯,所要做的就是買單。
實現代碼如下:
新建立一個食物的接口:
package com.diermeng.designPattern.SimpleFactory;
/* * 產品的抽象接口 */ public interface Food { /* * 獲得相應的食物 */ public void get(); } |
接下來建立具體的產品:麥香雞和薯條
package com.diermeng.designPattern.SimpleFactory.impl; import com.diermeng.designPattern.SimpleFactory.Food;
/* * 麥香雞對抽象產品接口的實現 */ public class McChicken implements Food{ /* * 獲取一份麥香雞 */ public void get(){ System.out.println("我要一份麥香雞"); } } |
package com.diermeng.designPattern.SimpleFactory.impl; import com.diermeng.designPattern.SimpleFactory.Food;
/* * 薯條對抽象產品接口的實現 */ public class Chips implements Food{ /* * 獲取一份薯條 */ public void get(){ System.out.println("我要一份薯條"); } } |
現在建立一個食物加工工廠:
package com.diermeng.designPattern.SimpleFactory.impl; import com.diermeng.designPattern.SimpleFactory.Food;
public class FoodFactory {
public static Food getFood(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException { if(type.equalsIgnoreCase("mcchicken")) { return McChicken.class.newInstance();
} else if(type.equalsIgnoreCase("chips")) { return Chips.class.newInstance(); } else { System.out.println("哎呀!找不到相應的實例化類啦!"); return null; }
} } |
最后我們建立測試客戶端:
package com.diermeng.designPattern.SimpleFactory.client; import com.diermeng.designPattern.SimpleFactory.Food; import com.diermeng.designPattern.SimpleFactory.impl.FoodFactory;
/* * 測試客戶端 */ public class SimpleFactoryTest { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//實例化各種食物 Food mcChicken = FoodFactory.getFood("McChicken"); Food chips = FoodFactory.getFood("Chips"); Food eggs = FoodFactory.getFood("Eggs");
//獲取食物 if(mcChicken!=null){ mcChicken.get(); } if(chips!=null){ chips.get(); } if(eggs!=null){ eggs.get(); }
} } |
輸出的結果如下:
哎呀!找不到相應的實例化類啦! 我要一份麥香雞 我要一份薯條 |
簡單工廠模式的優缺點分析:
優點:工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的信息,決定究竟應該創建哪個具體類的對象。用戶在使用時可以直接根據工廠類去創建所需的實例,而無需了解這些對象是如何創建以及如何組織的。有利於整個軟件體系結構的優化。
缺點:由於工廠類集中了所有實例的創建邏輯,這就直接導致一旦這個工廠出了問題,所有的客戶端都會受到牽連;而且由於簡單工廠模式的產品室基於一個共同的抽象類或者接口,這樣一來,但產品的種類增加的時候,即有不同的產品接口或者抽象類的時候,工廠類就需要判斷何時創建何種種類的產品,這就和創建何種種類產品的產品相互混淆在了一起,違背了單一職責,導致系統喪失靈活性和可維護性。而且更重要的是,簡單工廠模式違背了“開放封閉原則”,就是違背了“系統對擴展開放,對修改關閉”的原則,因為當我新增加一個產品的時候必須修改工廠類,相應的工廠類就需要重新編譯一遍。
總結一下:簡單工廠模式分離產品的創建者和消費者,有利於軟件系統結構的優化;但是由於一切邏輯都集中在一個工廠類中,導致了沒有很高的內聚性,同時也違背了“開放封閉原則”。另外,簡單工廠模式的方法一般都是靜態的,而靜態工廠方法是無法讓子類繼承的,因此,簡單工廠模式無法形成基於基類的繼承樹結構。
簡單工廠模式的實際應用簡介:
作為一個最基本和最簡單的設計模式,簡單工廠模式卻有很非常廣泛的應用,我們這里以Java中的JDBC操作數據庫為例來說明。
JDBC是SUN公司提供的一套數據庫編程接口API,它利用Java語言提供簡單、一致的方式來訪問各種關系型數據庫。Java程序通過JDBC可以執行SQL語句,對獲取的數據進行處理,並將變化了的數據存回數據庫,因此,JDBC是Java應用程序與各種關系數據進行對話的一種機制。用JDBC進行數據庫訪問時,要使用數據庫廠商提供的驅動程序接口與數據庫管理系統進行數據交互。