java设计模式1--工厂方法模式(Factory Method)
本文地址:http://www.cnblogs.com/archimedes/p/java-factory-method-pattern.html,轉(zhuǎn)載請注明源地址。
工廠方法模式(別名:虛擬構(gòu)造)
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。
概述
?當(dāng)系統(tǒng)準(zhǔn)備為用戶提供某個類的子類的實例,又不想讓用戶代碼和該子類形成耦合時,就可以使用工廠方法模式來設(shè)計系統(tǒng)。工廠方法模式的關(guān)鍵是在一個接口或抽象類中定義一個抽象方法,該方法返回某個類的子類的實例,該抽象類或接口讓其子類或?qū)崿F(xiàn)該接口的類通過重寫這個抽象方法返回某個子類的實例。
適用性
1.當(dāng)一個類不知道它所必須創(chuàng)建的對象的類的時候。
2.當(dāng)一個類希望由它的子類來指定它所創(chuàng)建的對象的時候。
3.當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候。 ?
參與者
1.Product 定義工廠方法所創(chuàng)建的對象的接口。
2.ConcreteProduct 實現(xiàn)Product接口。
3.Creator 聲明工廠方法,該方法返回一個Product類型的對象。 Creator也可以定義一個工廠方法的缺省實現(xiàn),它返回一個缺省的ConcreteProduct對象。 可以調(diào)用工廠方法以創(chuàng)建一個Product對象。
4.ConcreteCreator 重定義工廠方法以返回一個ConcreteProduct實例。
工廠方法模式的結(jié)構(gòu)與使用
模式的結(jié)構(gòu)中包括四種角色:
?抽象產(chǎn)品(Product)
?具體產(chǎn)品(ConcreteProduct)
?構(gòu)造者(Creator)
?具體構(gòu)造者(ConcreteCreator)?
模式的UML類圖
實戰(zhàn)部分
【例1】:假設(shè)有三個筆芯,分別是紅筆芯、藍(lán)筆芯和黑筆芯。用戶希望通過圓珠筆來明確筆芯的顏色。
模式的結(jié)構(gòu)的描述與使用?
1.抽象產(chǎn)品(Product):?PenCore.java
public abstract class PenCore{String color;public abstract void writeWord(String s); }2.具體產(chǎn)品(ConcreteProduct)_1 :?RedPenCore.java
public class RedPenCore extends PenCore{RedPenCore(){color="紅色";}public void writeWord(String s){System.out.println("寫出"+color+"的字:"+s);} }具體產(chǎn)品(ConcreteProduct)_2 :?BluePenCore.java
public class BluePenCore extends PenCore{BluePenCore(){color="藍(lán)色";}public void writeWord(String s){System.out.println("寫出"+color+"的字:"+s);} }具體產(chǎn)品(ConcreteProduct)_3:?BlackPenCore.java
public class BlackPenCore extends PenCore{BlackPenCore(){color="黑色";}public void writeWord(String s){System.out.println("寫出"+color+"的字:"+s);} }3.構(gòu)造者(Creator):?BallPen.java
public abstract class BallPen{BallPen(){System.out.println("生產(chǎn)了一只裝有"+getPenCore().color+"筆芯的圓珠筆");}public abstract PenCore getPenCore(); //工廠方法 }4.具體構(gòu)造者(ConcreteCreator):
RedBallPen.java public class RedBallPen extends BallPen{public PenCore getPenCore(){return new RedPenCore();} } BlueBallPen.java public class BlueBallPen extends BallPen{public PenCore getPenCore(){return new BluePenCore();} } BlackBallPen.java public class BlackBallPen extends BallPen{public PenCore getPenCore(){return new BlackPenCore();} }5.應(yīng)用?Application.java
public class Application{public static void main(String args[]){PenCore penCore;BallPen ballPen=new BlueBallPen();penCore=ballPen.getPenCore();penCore.writeWord("你好,很高興認(rèn)識你");ballPen=new RedBallPen();penCore=ballPen.getPenCore();penCore.writeWord("How are you");ballPen=new BlackBallPen();penCore=ballPen.getPenCore();penCore.writeWord("nice to meet you");} }?工廠方法模式的優(yōu)點
?使用工廠方法可以讓用戶的代碼和某個特定類的子類的代碼解耦。
?工廠方法使用戶不必知道它所使用的對象是怎樣被創(chuàng)建的,只需知道該對象有哪些方法即可。
總結(jié)
以上是生活随笔為你收集整理的java设计模式1--工厂方法模式(Factory Method)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java设计模式0--设计模式简介
- 下一篇: java设计模式2--抽象工厂模式(Ab