標籤:原廠模式 對象 main etc client 一個 rate new product
Factory 方法模式使用頻率比較高,其定義為:
原廠模式定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory 方法使一個類的執行個體化延遲到其子類。
一:通用源碼
step1:抽象產品類
public abstract class Product{ //產品類的公用方法 public void method1() { //商務邏輯 } //抽象方法 public abstract void method2();}
step2:具體產品類
public class ConcreteProduct1 extends Product{ public abstract void method2(); { //商務邏輯處理 }}public class ConcreteProduct2 extends Product{ public abstract void method2(); { //商務邏輯處理 }}
step3:抽象工廠類
public abstract class Creator{ /** * 建立一個產品對象,其輸入參數類型可以自行設定,通常為String、Enum、Class等,也可為空白 * @param c * @return */ public abstract <T extends Product> T createProduct(Class<T> c);}
具體如何產生一個產品的對象呢?有具體的工廠類實現。
step4:具體工廠類
public class ConcreteFactory extends Creator { @Override public <T extends Product> T createProduct(Class<T> c) { //定義一個生產的人種 Product product = null; try { //產生一個人種 product = (T)Class.forName(c.getName()).newInstance(); } catch (Exception e) { //異常處理 } return (T)product; }}
step5:情境類
public class Client{ public static void main(String[] args) { Creator creator = new ConcreteFactory(); Product product = creator.createProduct(ConcreteProduct1.class); /* * 後續業務處理 */ }}
二:使用女媧造人的例子,應用通用模板
step1:抽象產品類
public interface Human { //每個人種都有顏色 public void getColor(); //每個人種都會說話 public void talk();}
step2:具體產品類(這裡只給出一個白色的人)
public class WhiteHuman implements Human { @Override public void getColor() { // TODO Auto-generated method stub System.out.println("我是白色兒的"); } @Override public void talk() { // TODO Auto-generated method stub System.out.println("我說的話你聽不懂,you know?"); }}
step3:抽象工廠類
//抽象人類建立工廠public abstract class AbstractHumanFactory { //必須是Class類型,必須是Human的實作類別 public abstract <T extends Human> T createHuman(Class<T> c);}
step4:具體工廠類
public class HumanFactory extends AbstractHumanFactory { @Override public <T extends Human> T createHuman(Class<T> c) { //定義一個生產的人種 Human human = null; try { //產生一個人種 human = (T)Class.forName(c.getName()).newInstance(); } catch (Exception e) { System.out.println("人種建置錯誤"); } return (T)human; }}
step5:情境類
public class NvWa { //類比女媧造人的過程 public static void main(String[] args) { AbstractHumanFactory yinYangLu = new HumanFactory(); //造個白色兒的 Human wHuman = yinYangLu.createHuman(WhiteHuman.class); wHuman.getColor(); wHuman.talk(); //來個黑小子 Human bHuman = yinYangLu.createHuman(BlackHuman.class); bHuman.getColor(); bHuman.talk(); //小麥色的亞洲寶寶 Human yHuman = yinYangLu.createHuman(YellowHuman.class); yHuman.getColor(); yHuman.talk(); }}
三:理解
Factory 方法模式使用的比較頻繁,他是典型的解耦架構。高層模組只需要知道產品的抽象類別,其他的實作類別都不用關心。符合迪米特法則,我不需要的就不要去交流;符合依賴倒置原則,只依賴產品類的抽象;符合裡氏替換原則,使用產品子類替換產品父類。
四:寫在後面
設計模式比較抽象,對現在還沒工作的我來說的確有點難理解。我現在只能死記硬背,先能認出人家用的是那種設計模式。希望工作後的我能真正理解設計模式的精髓,掌握他的核心!
Factory 方法模式