標籤:
本文地址:http://www.cnblogs.com/archimedes/p/java-factory-method-pattern.html,轉載請註明源地址。
Factory 方法模式(別名:虛擬構造)
定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory Method使一個類的執行個體化延遲到其子類。
概述
當系統準備為使用者提供某個類的子類的執行個體,又不想讓使用者代碼和該子類形成耦合時,就可以使用Factory 方法模式來設計系統。Factory 方法模式的關鍵是在一個介面或抽象類別中定義一個抽象方法,該方法返回某個類的子類的執行個體,該抽象類別或介面讓其子類或實現該介面的類通過重寫這個抽象方法返回某個子類的執行個體。
適用性
1.當一個類不知道它所必須建立的對象的類的時候。
2.當一個類希望由它的子類來指定它所建立的對象的時候。
3.當類將建立對象的職責委託給多個協助子類中的某一個,並且你希望將哪一個協助子類是代理者這一資訊局部化的時候。
參與者
1.Product 定義Factory 方法所建立的對象的介面。
2.ConcreteProduct 實現Product介面。
3.Creator 聲明Factory 方法,該方法返回一個Product類型的對象。 Creator也可以定義一個Factory 方法的預設實現,它返回一個預設的ConcreteProduct對象。 可以調用Factory 方法以建立一個Product對象。
4.ConcreteCreator 重定義Factory 方法以返回一個ConcreteProduct執行個體。
Factory 方法模式的結構與使用
模式的結構中包括四種角色:
•抽象產品(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(); //Factory 方法}
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"); }} Factory 方法模式的優點
•使用Factory 方法可以讓使用者的代碼和某個特定類的子類的代碼解耦。
•Factory 方法使使用者不必知道它所使用的對象是怎樣被建立的,只需知道該對象有哪些方法即可。
java設計模式1--Factory 方法模式(Factory Method)