本文轉自:http://m.survivalescaperooms.com/archimedes/p/java-factory-method-pattern.html
概述工廠方法模式(別名:虛擬構造)
定義一個用于創建對象的接口,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。
當系統準備為用戶提供某個類的子類的實例,又不想讓用戶代碼和該子類形成耦合時,就可以使用工廠方法模式來設計系統。工廠方法模式的關鍵是在一個接口或抽象類中定義一個抽象方法,該方法返回某個類的子類的實例,該抽象類或接口讓其子類或實現該接口的類通過重寫這個抽象方法返回某個子類的實例。
適用性1.當一個類不知道它所必須創建的對象的類的時候。
2.當一個類希望由它的子類來指定它所創建的對象的時候。
3.當類將創建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
參與者1.PRoduct 定義工廠方法所創建的對象的接口。
2.ConcreteProduct 實現Product接口。
3.Creator 聲明工廠方法,該方法返回一個Product類型的對象。 Creator也可以定義一個工廠方法的缺省實現,它返回一個缺省的ConcreteProduct對象。 可以調用工廠方法以創建一個Product對象。
4.ConcreteCreator 重定義工廠方法以返回一個ConcreteProduct實例。
工廠方法模式的結構與使用模式的結構中包括四種角色:
•抽象產品(Product)
•具體產品(ConcreteProduct)
•構造者(Creator)
•具體構造者(ConcreteCreator)
模式的UML類圖

【例1】:假設有三個筆芯,分別是紅筆芯、藍筆芯和黑筆芯。用戶希望通過圓珠筆來明確筆芯的顏色。
模式的結構的描述與使用
1.抽象產品(Product):PenCore.java
public abstract class PenCore{ String color; public abstract void writeWord(String s);}2.具體產品(ConcreteProduct)_1 :RedPenCore.java
public class RedPenCore extends PenCore{ RedPenCore(){ color="紅色"; } public void writeWord(String s){ System.out.println("寫出"+color+"的字:"+s); }}具體產品(ConcreteProduct)_2 :BluePenCore.java
public class BluePenCore extends PenCore{ BluePenCore(){ color="藍色"; } public void writeWord(String s){ System.out.println("寫出"+color+"的字:"+s); }}具體產品(ConcreteProduct)_3:BlackPenCore.java
public class BlackPenCore extends PenCore{ BlackPenCore(){ color="黑色"; } public void writeWord(String s){ System.out.println("寫出"+color+"的字:"+s); }}3.構造者(Creator):BallPen.java
public abstract class BallPen{ BallPen(){ System.out.println("生產了一只裝有"+getPenCore().color+"筆芯的圓珠筆"); } public abstract PenCore getPenCore(); //工廠方法}4.具體構造者(ConcreteCreator):
RedBallPen.javapublic class RedBallPen extends BallPen{ public PenCore getPenCore(){ return new RedPenCore(); }}BlueBallPen.javapublic class BlueBallPen extends BallPen{ public PenCore getPenCore(){ return new BluePenCore(); }}BlackBallPen.javapublic class BlackBallPen extends BallPen{ public PenCore getPenCore(){ return new BlackPenCore(); }}5.應用application.java
public class Application{ public static void main(String args[]){ PenCore penCore; BallPen ballPen=new BlueBallPen(); penCore=ballPen.getPenCore(); penCore.writeWord("你好,很高興認識你"); ballPen=new RedBallPen(); penCore=ballPen.getPenCore(); penCore.writeWord("How are you"); ballPen=new BlackBallPen(); penCore=ballPen.getPenCore(); penCore.writeWord("nice to meet you"); }}工廠方法模式的優點•使用工廠方法可以讓用戶的代碼和某個特定類的子類的代碼解耦。
•工廠方法使用戶不必知道它所使用的對象是怎樣被創建的,只需知道該對象有哪些方法即可。
作者:archimedes出處:http://m.survivalescaperooms.com/archimedes/本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利.
新聞熱點
疑難解答