【正文】
第 5章 工廠方法模式 劉 偉 本章教學(xué)內(nèi)容 ?工廠方法模式 ? 模式動(dòng)機(jī)與定義 ? 模式結(jié)構(gòu)與分析 ? 模式實(shí)例與解析 ? 模式效果與應(yīng)用 ? 模式擴(kuò)展 工廠方法模式 ? 簡(jiǎn)單工廠模式的不足 ?在簡(jiǎn)單工廠模式中,只提供了一個(gè)工廠類,該工廠類處于對(duì)產(chǎn)品類進(jìn)行實(shí)例化的中心位置,它知道每一個(gè)產(chǎn)品對(duì)象的創(chuàng)建細(xì)節(jié),并決定何時(shí)實(shí)例化哪一個(gè)產(chǎn)品類。 簡(jiǎn)單工廠模式最大的缺點(diǎn)是當(dāng)有新產(chǎn)品要加入到系統(tǒng)中時(shí),必須修改工廠類,加入必要的處理邏輯,這違背了“開閉原則”。 在簡(jiǎn)單工廠模式中,所有的產(chǎn)品都是由同一個(gè)工廠創(chuàng)建,工廠類職責(zé)較重,業(yè)務(wù)邏輯較為復(fù)雜,具體產(chǎn)品與工廠類之間的耦合度高,嚴(yán)重影響了系統(tǒng)的靈活性和擴(kuò)展性,而工廠方法模式則可以很好地解決這一問題。 工廠方法模式 ?模式動(dòng)機(jī) ? 考慮這樣一個(gè)系統(tǒng),按鈕工廠類可以返回一個(gè)具體的按鈕實(shí)例,如圓形按鈕、矩形按鈕、菱形按鈕等。在這個(gè)系統(tǒng)中,如果需要增加一種新類型的按鈕,如橢圓形按鈕,那么 除了增加一個(gè)新的具體產(chǎn)品類之外,還需要修改工廠類的代碼,這就使得整個(gè)設(shè)計(jì)在一定程度上違反了“開閉原則”。 工廠方法模式 ? 模式動(dòng)機(jī) ? 現(xiàn)在對(duì)該系統(tǒng)進(jìn)行修改,不再設(shè)計(jì)一個(gè)按鈕工廠類來統(tǒng)一負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是 將具體按鈕的創(chuàng)建過程交給專門的工廠子類去完成 ,我們 先定義一個(gè)抽象的按鈕工廠類 , 再定義具體的工廠類來生成圓形按鈕、矩形按鈕、菱形按鈕等 ,它們實(shí)現(xiàn)在抽象按鈕工廠類中定義的方法。這種抽象化的結(jié)果使這種結(jié)構(gòu) 可以在不修改具體工廠類的情況下引進(jìn)新的產(chǎn)品 ,如果出現(xiàn)新的按鈕類型,只需要為這種新類型的按鈕創(chuàng)建一個(gè)具體的工廠類就可以獲得該新按鈕的實(shí)例,這一特點(diǎn)無疑使得工廠方法模式具有超越簡(jiǎn)單工廠模式的優(yōu)越性, 更加符合“開閉原則” 。 工廠方法模式 ?模式動(dòng)機(jī) ? 使用工廠方法模式設(shè)計(jì)的按鈕工廠 工廠方法模式 ?模式定義 ?工廠方法模式 (Factory Method Pattern)又稱為工廠模式 , 也叫 虛擬構(gòu)造器 (Virtual Constructor)模式 或者 多態(tài)工廠 (Polymorphic Factory)模式 , 它屬于類創(chuàng)建型模式 。 在工廠方法模式中 , 工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口 , 而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象 , 這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成 , 即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類 。 工廠方法模式 ?模式定義 ?Factory Method Pattern: Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. ?Frequency of use: high 工廠方法模式 ?模式結(jié)構(gòu) r e t u r n n e w C o n c r e t e P r o d u c t ( ) 。 cr e a t e ConcreteProd uctProductConcreteF actory+ factoryMethod ()...: ProductFactory+ factoryMethod ()...: Product工廠方法模式 ?模式結(jié)構(gòu) ?工廠方法模式包含如下角色: ? Product:抽象產(chǎn)品 ? ConcreteProduct:具體產(chǎn)品 ? Factory:抽象工廠 ? ConcreteFactory:具