軟件體系結(jié)構(gòu)與設(shè)計模式 第十二章 工廠方法模式_第1頁
軟件體系結(jié)構(gòu)與設(shè)計模式 第十二章 工廠方法模式_第2頁
軟件體系結(jié)構(gòu)與設(shè)計模式 第十二章 工廠方法模式_第3頁
軟件體系結(jié)構(gòu)與設(shè)計模式 第十二章 工廠方法模式_第4頁
軟件體系結(jié)構(gòu)與設(shè)計模式 第十二章 工廠方法模式_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第十三章第十三章 工廠方法模式工廠方法模式 12/25/20211工廠方法模式(別名:虛擬構(gòu)造)工廠方法模式(別名:虛擬構(gòu)造) 定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。個類。Factory Method使一個類的實例化延遲到其子類使一個類的實例化延遲到其子類。Mediator Pattern(Another Name: Virtual Constructor) Define an interface for creating an object, but let subclasses decide which class to in

2、stantiate. Factory Method lets a class defer instantiation to subclasses. 在鑄造成型的過程中,制造者首先將塑料加工成可成型的粉末,然后將塑料粉末注入到需要的模具中。在Factory Method模式中,子類 (在這里就是指模具)來決定需要實例化那個類。在這個例子中,ToyHorseMold類就是被實例化的類。一一 、 概述概述 12/25/20213 當系統(tǒng)準備為用戶提供某個類的子類的實例,當系統(tǒng)準備為用戶提供某個類的子類的實例,又不想讓用戶代碼和該子類形成耦合時,就可以又不想讓用戶代碼和該子類形成耦合時,就可以使用工廠

3、方法模式來設(shè)計系統(tǒng)。工廠方法模式的使用工廠方法模式來設(shè)計系統(tǒng)。工廠方法模式的關(guān)鍵是在一個接口或抽象類中定義一個抽象方法,關(guān)鍵是在一個接口或抽象類中定義一個抽象方法,該方法返回某個類的子類的實例,該抽象類或接該方法返回某個類的子類的實例,該抽象類或接口讓其子類或?qū)崿F(xiàn)該接口的類通過重寫這個抽象口讓其子類或?qū)崿F(xiàn)該接口的類通過重寫這個抽象方法返回某個子類的實例。方法返回某個子類的實例。 二、二、工廠方法模式的結(jié)構(gòu)與使用工廠方法模式的結(jié)構(gòu)與使用12/25/20214模式的結(jié)構(gòu)中包括四種角色:模式的結(jié)構(gòu)中包括四種角色:抽象產(chǎn)品(抽象產(chǎn)品(ProductProduct) 具體產(chǎn)品(具體產(chǎn)品(Concrete

4、ProductConcreteProduct) 構(gòu)造者(構(gòu)造者(CreatorCreator) 具體構(gòu)造者(具體構(gòu)造者(ConcreteCreatorConcreteCreator) 12/25/20215模式的模式的UMLUML類圖類圖 模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 有一個PenCore類(筆芯),該類是一個抽象類。假設(shè)PenCore類有三個子類,分別是RedPenCore、BluePenCore和BlackPenCore,而系統(tǒng)設(shè)計的目的是為用戶提供BallPen類(圓珠筆)的子類的實例,即含有筆芯的圓珠筆,也就是說系統(tǒng)想讓用戶使用BallPen類的子類的實例來得到PenC

5、ore類的子類的實例。12/25/20217模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 1 1抽象產(chǎn)品(抽象產(chǎn)品(ProductProduct) : : PenCore.javaPenCore.java public abstract class public abstract class PenCorePenCore String color; String color; public abstract void public abstract void writeWord(StringwriteWord(String s); s); 12/25/20218模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)

6、的描述與使用 2 2具體產(chǎn)品(具體產(chǎn)品(ConcreteProductConcreteProduct)_1 : _1 : RedPenCore.javaRedPenCore.java public class public class RedPenCoreRedPenCore extends extends PenCorePenCore RedPenCoreRedPenCore()() color= color=紅色紅色; public void public void writeWord(StringwriteWord(String s) s) System.out.printlnSyste

7、m.out.println(寫出寫出+color+color+的字的字:+s);:+s); 12/25/20219模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 2 2具體產(chǎn)品(具體產(chǎn)品(ConcreteProductConcreteProduct)_2 : _2 : BluePenCore.javaBluePenCore.java public class public class BluePenCoreBluePenCore extends extends PenCorePenCore BluePenCoreBluePenCore()() color= color=藍色藍色; public

8、void public void writeWord(StringwriteWord(String s) s) System.out.printlnSystem.out.println(寫出寫出+color+color+的字的字:+s);:+s); 12/25/202110模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 2 2具體產(chǎn)品(具體產(chǎn)品(ConcreteProductConcreteProduct)_3: _3: BlackPenCore.javaBlackPenCore.java public class public class BlackPenCoreBlackPenCore ex

9、tends extends PenCorePenCore BlackPenCoreBlackPenCore()() color= color=黑色黑色; public void public void writeWord(StringwriteWord(String s) s) System.out.printlnSystem.out.println(寫出寫出+color+color+的字的字:+s);:+s); 12/25/202111模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)的描述與使用 3 3構(gòu)造者(構(gòu)造者(CreatorCreator): :BallPen.javaBallPen.java pu

10、blic abstract class public abstract class BallPenBallPen BallPenBallPen()() System.out.printlnSystem.out.println(生產(chǎn)了一只裝有生產(chǎn)了一只裝有+getPenCore().colorgetPenCore().color+筆芯的圓珠筆筆芯的圓珠筆 );); public abstract public abstract PenCorePenCore getPenCoregetPenCore(); /(); /工廠方法工廠方法 12/25/2021124 4具體構(gòu)造者(具體構(gòu)造者(Conc

11、reteCreatorConcreteCreator): :RedBallPen.javaRedBallPen.javapublic class public class RedBallPenRedBallPen extends extends BallPenBallPen public public PenCorePenCore getPenCoregetPenCore()() return new return new RedPenCoreRedPenCore();(); BlueBallPen.javaBlueBallPen.javapublic class public class B

12、lueBallPenBlueBallPen extends extends BallPenBallPen public public PenCorePenCore getPenCoregetPenCore()() return new return new BluePenCoreBluePenCore();(); BlackBallPen.javapublic class BlackBallPen extends BallPen public PenCore getPenCore() return new BlackPenCore(); 12/25/202114模式的結(jié)構(gòu)的描述與使用模式的結(jié)構(gòu)

13、的描述與使用 5 5應(yīng)用應(yīng)用 Application.javaApplication.java public class Applicationpublic class Application public static void main(String public static void main(String argsargs) PenCorePenCore penCorepenCore; ; BallPenBallPen ballPenballPen=new =new BlueBallPenBlueBallPen();(); penCorepenCore= =ballPen.getPe

14、nCoreballPen.getPenCore();(); penCore.writeWordpenCore.writeWord(你好你好, ,很高興認識你很高興認識你);); ballPenballPen=new =new RedBallPenRedBallPen();(); penCorepenCore= =ballPen.getPenCoreballPen.getPenCore();(); penCore.writeWord(HowpenCore.writeWord(How are you); are you); ballPenballPen=new =new BlackBallPenB

15、lackBallPen();(); penCorepenCore= =ballPen.getPenCoreballPen.getPenCore();(); penCore.writeWord(nicepenCore.writeWord(nice to meet you); to meet you); 三、三、工廠方法模式的優(yōu)點工廠方法模式的優(yōu)點 12/25/202115使用工廠方法可以讓用戶的代碼和某個特定類的子類的代碼解耦。工廠方法使用戶不必知道它所使用的對象是怎樣被創(chuàng)建的,只需知道該對象有哪些方法即可。四、適合使用工廠方法的情景 用戶需要一個類的子類的實例,但不希望與該類的子類形成耦合。

16、用戶需要一個類的子類的實例,但用戶不知道該類有哪些子類可用。五、應(yīng)用舉例創(chuàng)建藥品對象 系統(tǒng)目前已經(jīng)按著有關(guān)藥品的規(guī)定設(shè)計了一個抽象類Drug,該抽象類規(guī)定了所創(chuàng)建的藥品必須給出藥品的成分及其含量。Drug目前有兩個子類:Paracetamol和Amorolfine。 Paracetamol負責創(chuàng)建氨加黃敏一類的藥品,Amorolfine負責創(chuàng)建鹽酸阿莫羅芬一類的藥品。 一個為某藥店開發(fā)的應(yīng)用程序需要使用Drug類的某個子類的實例為用戶提供藥品,但是藥店的應(yīng)用程序不能使用Drug的子類的構(gòu)造方法直接創(chuàng)建對象,因為藥店沒有能力給出藥品的各個成分的含量,只有藥廠才有這樣的能力。/ Drug.java

17、public abstract class Drug String constitute; String name; public String getName() return name; public String getConstitute() return constitute; / Paracetamol.javapublic class Paracetamol extends Drug String part1=每粒含乙酰氨基酚; String part2=每粒含咖啡因; String part3=每粒含人工牛黃; String part4=每粒含馬來酸氯苯; public Par

18、acetamol(String name,int a) =name; part1=part1+:+a0+毫克n; part2=part2+:+a1+毫克n; part3=part3+:+a2+毫克n; part4=part4+:+a3+毫克n; constitute=part1+part2+part3+part4; / Amorolfine.javapublic class Amorolfine extends Drug String part1=每粒含甲硝唑; String part2=每粒含人工牛黃; public Amorolfine(String name,int a

19、) =name; part1=part1+:+a0+毫克n; part2=part2+:+a1+毫克n; constitute=part1+part2; / DrugCreator.javapublic interface DrugCreator public abstract Drug getDrug(); / ParaDrugCreator .javapublic class ParaDrugCreator implements DrugCreator public Drug getDrug() int a=250,15,1,10; Drug drug=new Parac

20、etamol(氨加黃敏膠囊,a); return drug; / AmorDrugCreator .javapublic class AmorDrugCreator implements DrugCreator public Drug getDrug() int a=200,5; Drug drug=new Amorolfine(甲硝矬膠囊,a); return drug; / Application.javaimport java.util.*;public class Application public static void main(String args) DrugCreator

21、creator=new ParaDrugCreator(); Drug drug=creator.getDrug(); System.out.println(drug.getName()+的成份:); System.out.println(drug.getConstitute(); creator=new AmorDrugCreator(); drug=creator.getDrug(); System.out.println(drug.getName()+的成份:); System.out.println(drug.getConstitute(); 六、應(yīng)用舉例記錄日志public inte

22、rface Trace / turn on and off debugging public void setDebug( boolean debug ); / write out a debug message public void debug( String message ); / write out an error message public void error( String message );public class FileTrace implements Trace private java.io.PrintWriter pw; private boolean deb

23、ug; public FileTrace() throws java.io.IOException pw = new java.io.PrintWriter( new java.io.FileWriter( c:trace.log ) ); public void setDebug( boolean debug ) this.debug = debug; public void debug( String message ) if( debug ) / only print if debug is true pw.println( DEBUG: + message ); pw.flush();

24、 public void error( String message ) / always print out errors pw.println( ERROR: + message ); pw.flush(); public class SystemTrace implements Trace private boolean debug; public void setDebug( boolean debug ) this.debug = debug; public void debug( String message ) if( debug ) / only print if debug

25、is true System.out.println( DEBUG: + message ); public void error( String message ) / always print out errors System.out.println( ERROR: + message ); SystemTrace log = new SystemTrace();/. code .log.debug( entering loog );/ . etc .public class TraceFactory public static Trace getTrace() return new S

26、ystemTrace(); /. some code .Trace log = new TraceFactory.getTrace();/. code .log.debug( entering loog );/ . etc .七、應(yīng)用舉例自動車工廠 有一系列的自動車產(chǎn)品Bus(公交車),Truck(卡車);它們需要由不同的工廠生產(chǎn),但具有相同的生產(chǎn)流程。為了以后擴展其他流水線,比如摩托車,我們需要一種柔軟的方案來實現(xiàn)自動車生產(chǎn)的過程。設(shè)計目標 一方面,可以不用關(guān)心產(chǎn)品對象的具體實現(xiàn),簡化和統(tǒng)一Client調(diào)用過程; 另一方面,可以讓整個系統(tǒng)具有靈活的可擴展性,若要擴展生產(chǎn)摩托車的流水線,只要再

27、實現(xiàn)一個摩托車類以及摩托車工廠類就行,而Client的調(diào)用方法完全不需改變。 實現(xiàn)方法一abstract class CarFactory /定義生產(chǎn)自動車生產(chǎn)的接口規(guī)范定義生產(chǎn)自動車生產(chǎn)的接口規(guī)范 public Car createCar(); class BusFactory extends CarFactory public Car createCar() /生產(chǎn)公交車生產(chǎn)公交車 return new CarBus(); class TruckFactory extends CarFactory public Car createCar() /生產(chǎn)卡車生產(chǎn)卡車 return new TruckBus(); pu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論