簡單工廠模式的概念
就是建立一個工廠類,對實現了同一介面的一些類別進行實例的創建。簡單工廠模式的實質是由一個工廠類別根據傳入的參數,動態決定應該建立哪一個產品類別(這些產品類別繼承自一個父類別或介面)的實例。
簡單工廠模式的UML圖
簡單工廠模式代碼
學習簡單工廠模式的時候我用的是一個與人類有相關的例子。人類在世界分為男人和女人,先定義一個Human產品的抽象介面
/** * This is factory patter package */ package com.roc.factory; /** * 产品的抽象接口 人类 * @author liaowp * */ public interface Human { public void say(); }
然後定義男人和女人,同樣都有說話的方法。
/** * This is factory patter package */ package com.roc.factory; /** * man 男人 * @author liaowp * */ public class Man implements Human { /* say method * @see com.roc.factory.Human#say() */ @Override public void say() { System.out.println("男人"); } }
/** * This is factory patter package */ package com.roc.factory; /**女人 * @author liaowp * */ public class Woman implements Human { /* say method * @see com.roc.factory.Human#say() */ @Override public void say() { System.out.println("女人"); } }
最後寫一個工廠類,用來創造男人和女人。第一種方式是使用邏輯判斷的方式來實現的。
package com.roc.factory; /** * 简单工厂 * @author liaowp * */ public class SampleFactory { public static Human makeHuman(String type){ if(type.equals("man")){ Human man = new Man(); return man; }else if(type.equals("womman")){ Human woman = new Woman(); return woman; }else{ System.out.println("生产不出来"); return null; } } }
第二方式是使用java的放射來實現的,我覺得這一類的實現方式比較好。
package com.roc.factory; /** * 简单工厂放射实现 * @author liaowp * */ public class SampleFactory1 { public static Human makeHuman(Class c){ Human human = null; try { human = (Human) Class.forName(c.getName()).newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block System.out.println("不支持抽象类或接口"); e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("没有足够权限,即不能访问私有对象"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block System.out.println("类不存在"); e.printStackTrace(); } return human; } }
最後是客戶端的代碼
package com.roc.factory; /** * 简单工厂测试 * @author liaowp * */ public class Client { public static void main(String[] args) { // Human man = SampleFactory.makeHuman("man"); // man.say(); // Human womman = SampleFactory.makeHuman("womman"); // womman.say(); // Human test = SampleFactory.makeHuman("tttt"); Human man = SampleFactory1.makeHuman(Man.class); man.say(); Human woman = SampleFactory1.makeHuman(Woman.class); woman.say(); } }
簡單工廠模式應用場景
優點:工廠類是整個模式的關鍵。創建哪個具體類別的物件.透過使用工廠類別,外界可以從直接創建具體產品物件的尷尬局面擺脫出來,僅僅需要負責「消費」物件就可以了。而不必管這些物件究竟如何創建及如何組織的.明確了各自的職責和權利,有利於整個軟體體系結構的最佳化。
缺點:由於工廠類別集中了所有實例的創建邏輯,違反了高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類別中;它所能創建的類別只能是事先考慮到的,如果需要增加新的類,則需要改變工廠類了。當系統中的具體產品類別不斷增加時候,可能會出現要求工廠類別根據不同條件建立不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模組功能的蔓延,對系統的維護和擴展非常不利;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。
更多java設計模式之簡單工廠模式簡述相關文章請關注PHP中文網!