###工廠方法模式html
####優勢數據庫
良好的封裝性,代碼結構清晰。建立一個對象只要只知道對象的類名,不用知道建立對象的艱辛過程,減小模塊間的耦合。ide
擴展性很是優秀。在增長產品類的狀況下,只要適當地修改具體的工廠類或擴展一個工廠類。例如在下面的例子中,須要增長一個棕色人種,則只須要增長一個BrownHuman類,工廠類不用任何修改就可完成系統擴展。code
屏蔽產品類。產品類的實現如何變化,調用者都不須要關心,它只須要關心產品的接口,只要接口保持不表,系統中的上層模塊就不要發生變化,由於產品類的實例化工做是由工廠類負責,一個產品對象具體由哪個產品生成是由工廠類決定的。例如數據庫開發中 :使用JDBC鏈接數據庫,數據庫從MySql切換到Oracle,須要改動地方就是切換一下驅動名稱,其餘的都不須要修改。htm
####代碼實現女娃造人對象
//抽象工廠 public abstract class AbstractHumanFactory { abstract Human createHuman(Class<? extends Human> c); } //女娃的八卦爐 public class HumanFactory extends AbstractHumanFactory { @Override Human createHuman(Class<? extends Human> c) { Human human = null; try { Class clazz = Class.forName(c.getName()); human = (Human) clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } return human; } } //人接口 public interface Human { public void getColor(); public void talk(); } //黑人 public class BlackHuman implements Human { public void getColor() { System.out.println("黑人的皮膚是黑色的"); } public void talk() { System.out.println("黑人說的話聽不懂"); } } //白人 public class WhiteHuman implements Human { public void getColor() { System.out.println("白人的皮膚是白色的"); } public void talk() { System.out.println("白種人說的話是單字節"); } } //黃人 public class YellowHuman implements Human { public void getColor() { System.out.println("黃種人的皮膚是黃色的"); } public void talk() { System.out.println("黃種人說的話是雙字節"); } } //女娃開始造人 public class NvWa { public static void main(String[] args) { //聲明陰陽八卦爐 AbstractHumanFactory YinYangLu = new HumanFactory(); //第一次火候不夠造就白人 System.out.println("*******造白人*******"); Human whiteHuman = YinYangLu.createHuman(WhiteHuman.class); whiteHuman.getColor(); whiteHuman.talk(); //第二次火候大了造就黑人 System.out.println("*******造黑人*******"); Human blackHuman = YinYangLu.createHuman(BlackHuman.class); blackHuman.getColor(); blackHuman.talk(); //第三次火候恰好造就黃人 System.out.println("*******造黃人*******"); Human yellowHuman = YinYangLu.createHuman(YellowHuman.class); yellowHuman.getColor(); yellowHuman.talk(); } }
工廠模式方法比較blog