NET設計模式工廠方法模式_第1頁
NET設計模式工廠方法模式_第2頁
NET設計模式工廠方法模式_第3頁
NET設計模式工廠方法模式_第4頁
NET設計模式工廠方法模式_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、.NET設計模式(2): 工廠方法模式 工廠方法模式介紹: 在簡單工廠模式中,我們提到,工廠方法模式是簡單工廠模式的一個延伸,它屬于Gof23中設計模式的創(chuàng)建型設計模式。它解決的仍然是軟件設計中與創(chuàng)建對象有關的問題。它可以更好的處理客戶的需求變化。工廠方法模式引入 我們繼續(xù)來說“new”的問題,我們在簡單工廠模式中,將實例化對象的工作推遲到了專門負責創(chuàng)建對象的工廠類中,這樣,在我們事先預知的情況下,可以根據我們的需要動態(tài)創(chuàng)建產品類。但是,我們的預知是有限的,客戶的變化可能是無限的。所以,就出現了問題,一旦客戶的變化超越了我們的預知,我們就必須修改我們的源代碼了。這是設計模式所不允許的,怎么辦呢

2、?工廠方法模式正是解決此類問題的。 問題:具體工廠類的創(chuàng)建工作不能滿足我們的要求了,創(chuàng)建的工作變化了 解決思路:哪里變化,封裝哪里。把具體工廠封裝起來。定義和意圖定義 工廠方法模式又稱為工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態(tài)工廠模式(Polymorphic Factory),在工廠方法模式中,父類負責定義創(chuàng)建對象的公共接口,而子類則負責生成具體的對象,這樣做的目的是將類的實例化操作延遲到子類中完成,即由子類來決定究竟應該實例化(創(chuàng)建)哪一個類。意圖 定義一個用戶創(chuàng)建對象的接口,讓子類決定實例化哪一個類,工廠方法模式使一個類的實例化延遲到其子類。參于者抽象

3、產品角色(Product)定義產品的接口 具體產品角色(ConcreteProduct) 實現接口Product的具體產品類 抽象工廠角色(Creator) 聲明工廠方法(FactoryMethod),返回一個產品 真實的工廠(ConcreteCreator)實現FactoryMethod工廠方法,由客戶調用,返回一個產品的實例 工廠方法模式UML圖現實生活中的例子 為了方便大家理解,我仍然舉穿衣服方面的一個例子。這個例子與簡單工廠模式中的那個例子有些不同。 據說清朝有個皇帝穿衣非常的奢侈,每種衣服(具體產品類)由一宮女(具體工廠類)專門負責,這樣一來,每增加一種衣服(具體產品類),就要多出一

4、個宮女(具體工廠類),但是他們各負其責,互不影響?;实壑赃@樣做,是因為針對穿衣服這件事來說,可擴展性是非常強的。分析實現的功能:可以根據皇帝的要求,動態(tài)的創(chuàng)建(由宮女去拿)已存在的具體產品(衣服),如果皇帝的要求太苛刻,這種衣服還沒有,只需要增加一個宮女,一個衣服就能夠滿足他的要求了。每個宮女只負責一種衣服(高內聚),要增加一種衣服,對于以前的所有宮女與衣服來說,都不會受到影響(設計模式中所期望的)。說到這里,是不是明白了工廠方法模式所能解決的問題及其應用了?呵呵。你一定在想,比簡單工廠模式靈活性高吧。抽象工廠角色代碼 /*/ / 抽象工廠類,定義產品的接口 / public interf

5、ace IFactory ICoat CreateCoat(); 抽象產品角色代碼 /*/ / 抽象產品類 / public interface ICoat void ShowCoat(); 具體工廠角色代碼 / / 具體工廠類:用于創(chuàng)建商務上衣類 / public class BusinessFactory:IFactory public ICoat CreateCoat() return new BusinessCoat(); /*/ / 具體工廠類,用于創(chuàng)建時尚上衣 / public class FashionFactory : IFactory public ICoat CreateC

6、oat() return new FashionCoat(); 具體產品角色代碼 / / 具體產品類,商務上衣類 / public class BusinessCoat:ICoat public void ShowCoat() Console.WriteLine(這件是商務上衣); /*/ / 具體產品類,時尚上衣類 / public class FashionCoat : ICoat public void ShowCoat() Console.WriteLine(這件是時尚上衣); 客戶端代碼 static void Main(string args) /為了方便以后修改,將工廠類的類名寫

7、在應用程序配置文件中 string factoryName = ConfigurationManager.AppSettingsFactoryName; IFactory factory = (IFactory)Assembly.Load(ConcreteFactory).CreateInstance(FactoryMethod. + factoryName); ICoat coat = factory.CreateCoat(); /顯示你要的上衣 coat.ShowCoat(); 客戶端代碼需要注意的兩個地方:1 把具體工廠類類名稱寫在了應用程序配置文件中,方便修改2 用到了反射,利用.NE

8、T提供的反射可以根據類名來創(chuàng)建它的實例,非常方便反射技術Assembly.Load(“程序集名稱”).CreateInstance(“命名空間.類名稱”);名稱空間:using System.Reflection;由反射想到的如果在具體工廠中,每次new的對象都是一個,而且這些類是繼承自抽象產品接口的,那么我們用簡單工廠模式也可以實現動態(tài)的增加具體產品類。這樣來做,在簡單工廠模式中最核心的部分-工廠類不要根據傳來的條件去動態(tài)創(chuàng)建產品類,利用反射機制去創(chuàng)建。把要實例化的類名放在應用程序配置文件中,呵呵。這樣利用.NET特有的反射就可以用簡單工廠模式解決更多的問題了,工廠方法模式的一部分問題也是可

9、以通過“這樣的簡單工廠模式”解決的,在需要增加具體產品類時,不用增加具體工廠,是不是簡單一些呀。下去試一下。優(yōu)點與缺點優(yōu)點 基于工廠角色和產品角色的多態(tài)性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定創(chuàng)建何種產品對象。而且如何創(chuàng)建一個具體產品的細節(jié)完全封裝在具體工廠內部,符合高內聚,低耦合。 在系統中加入新產品時,無需修改抽象工廠和抽象產品提供的接口,無需修改客戶端,也無需修改其他的具體工廠和具體產品,很好的利用了封裝和委托。 缺點 在添加新產品時,需要編寫新的具體產品類(其實這不算一個缺點,因為這是不可避免的),要增加與之對應的具體工廠類。 應用情景類不知道自己要創(chuàng)建哪一個對象時 類用它的子類來指定創(chuàng)建哪個對象 當類將創(chuàng)建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候 與簡單工廠的區(qū)別簡單工廠模式的最大優(yōu)點在于工廠類中包含了必要的邏輯判

溫馨提示

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

評論

0/150

提交評論