日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转载】创建型-工厂方法模式

發布時間:2023/12/9 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】创建型-工厂方法模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹:
在簡單工廠模式中,我們提到,工廠方法模式是簡單工廠模式的一個延伸,它屬于Gof23中設計模式的創建型設計模式。它解決的仍然是軟件設計中與創建對象有關的問題。它可以更好的處理客戶的需求變化。

引入
我們繼續來說"new"的問題,我們在簡單工廠模式中,將實例化對象的工作推遲到了專門負責創建對象的工廠類中,這樣,在我們事先預知的情況下,可以根據我們的需要動態創建產品類。但是,我們的預知是有限的,客戶的變化可能是無限的。所以,就出現了問題,一旦客戶的變化超越了我們的預知,我們就必須修改我們的源代碼了。這是設計模式所不允許的,怎么辦呢?工廠方法模式正是解決此類問題的。
問題:具體工廠類的創建工作不能滿足我們的要求了,創建的工作變化了
解決思路:哪里變化,封裝哪里。把具體工廠封裝起來。

定義
工廠方法模式又稱為工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠模式(Polymorphic Factory),在工廠方法模式中,父類負責定義創建對象的公共接口,而子類則負責生成具體的對象,這樣做的目的是將類的實例化操作延遲到子類中完成,即由子類來決定究竟應該實例化(創建)哪一個類。

意圖
定義一個用戶創建對象的接口,讓子類決定實例化哪一個類,工廠方法模式使一個類的實例化延遲到其子類。

參與者

  • 抽象產品角色(Product)
    定義產品的接口
  • 具體產品角色(ConcreteProduct)
    實現接口Product的具體產品類
  • 抽象工廠角色(Creator)
    聲明工廠方法(FactoryMethod),返回一個產品
  • 真實的工廠(ConcreteCreator)
    實現FactoryMethod工廠方法,由客戶調用,返回一個產品的實例

工廠方法模式UML圖


現實生活中的例子
為了方便大家理解,我仍然舉穿衣服方面的一個例子。這個例子與簡單工廠模式中的那個例子有些不同。
據說清朝有個皇帝穿衣非常的奢侈,每種衣服(具體產品類)由一宮女(具體工廠類)專門負責,這樣一來,每增加一種衣服(具體產品類),就要多出一個宮女(具體工廠類),但是他們各負其責,互不影響。皇帝之所以這樣做,是因為針對穿衣服這件事來說,可擴展性是非常強的()。

分析
實現的功能:可以根據皇帝的要求,動態的創建(由宮女去拿)已存在的具體產品(衣服),如果皇帝的要求太苛刻,這種衣服還沒有,只需要增加一個宮女,一個衣服就能夠滿足他的要求了。每個宮女只負責一種衣服(高內聚),要增加一種衣服,對于以前的所有宮女與衣服來說,都不會受到影響(設計模式中所期望的)。說到這里,是不是明白了工廠方法模式所能解決的問題及其應用了?呵呵。。你一定在想,比簡單工廠模式靈活性高吧。。

抽象工廠角色代碼

1namespace FactoryMethod2{3 /**//// <summary>4 /// 抽象工廠類,定義產品的接口5 /// </summary>6 public interface IFactory7 {8 ICoat CreateCoat();9 } 10}

?

抽象產品角色代碼

?1namespace?FactoryMethod
?2{
?3????/**////?<summary>
?4????///?抽象產品類
?5????///?</summary>

?6????public?interface?ICoat
?7????{
?8????????void?ShowCoat();
?9????}

10}

?

具體工廠角色代碼

?

?1namespace?FactoryMethod
?2{
?3????/**////?<summary>
?4????///?具體工廠類:用于創建商務上衣類
?5????///?</summary>

?6????public?class?BusinessFactory:IFactory
?7????{????????
?8????????public?ICoat?CreateCoat()
?9????????{
10????????????return?new?BusinessCoat();
11????????}

12????}

13
14????/**////?<summary>
15????///?具體工廠類,用于創建時尚上衣
16????///?</summary>

17????public?class?FashionFactory?:?IFactory
18????{
19????????public?ICoat?CreateCoat()
20????????{
21????????????return?new?FashionCoat();
22????????}

23????}

24}

?

具體產品角色代碼

?

?1namespace?FactoryMethod
?2{
?3????/**////?<summary>
?4????///?具體產品類,商務上衣類
?5????///?</summary>

?6????public?class?BusinessCoat:ICoat
?7????{
?8????????public?void?ShowCoat()
?9????????{
10????????????Console.WriteLine("這件是商務上衣");
11????????}

12????}

13
14????/**////?<summary>
15????///?具體產品類,時尚上衣類
16????///?</summary>

17????public?class?FashionCoat?:?ICoat
18????{
19????????public?void?ShowCoat()
20????????{
21????????????Console.WriteLine("這件是時尚上衣");
22????????}

23????}

24}

25

?

客戶端代碼

?

?1namespace?FactoryMethod
?2{
?3????/**////?<summary>
?4????///?客戶端代碼
?5????///?</summary>
?6????class?Client
?7????{
?8????????static?void?Main(string[]?args)
?9????????{
10????????????//為了方便以后修改,將工廠類的類名寫在應用程序配置文件中
11????????????string?factoryName?=?ConfigurationManager.AppSettings["FactoryName"];
12??????????
13????????????IFactory?factory?=?(IFactory)Assembly.Load("ConcreteFactory").CreateInstance("FactoryMethod."?+?factoryName);
14????????????
15????????????ICoat?coat?=?factory.CreateCoat();
16????????????//顯示你要的上衣
17????????????coat.ShowCoat();
18????????}

19????}

20}

?

客戶端代碼需要注意的兩個地方:
1,把具體工廠類類名稱寫在了應用程序配置文件中,方便修改
2,用到了反射,利用.NET提供的反射可以根據類名來創建它的實例,非常方便


由反射想到的:
下面這一段內容不是計劃要寫的。
如果在具體工廠中,每次new的對象都是一個,而且這些類是繼承自抽象產品接口的,那么我們用簡單工廠模式也可以實現動態的增加具體產品類。這樣來做,在簡單工廠模式中最核心的部分----工廠類不要根據傳來的條件去動態創建產品類,利用反射機制去創建。把要實例化的類名放在應用程序配置文件中,呵呵。。這樣利用.NET特有的反射就可以用簡單工廠模式解決更多的問題了,工廠方法模式的一部分問題也是可以通過“這樣的簡單工廠模式”解決的,在需要增加具體產品類時,不用增加具體工廠,是不是簡單一些呀。下去試一下。。。

優點:

?

  • 基于工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定創建何種產品對象。而且如何創建一個具體產品的細節完全封裝在具體工廠內部,符合高內聚,低耦合。
  • 在系統中加入新產品時,無需修改抽象工廠和抽象產品提供的接口,無需修改客戶端,也無需修改其他的具體工廠和具體產品,很好的利用了封裝和委托。

?

缺點:

?

  • 在添加新產品時,需要編寫新的具體產品類(其實這不算一個缺點,因為這是不可避免的),要增加與之對應的具體工廠類。

?

應用情景:

?

  • 類不知道自己要創建哪一個對象時
  • 類用它的子類來指定創建哪個對象
  • 當類將創建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候??

?

工廠方法模式在ASP.NET HTTP通道中的應用,TerryLee在他的那篇文件中寫的非常好,推薦去看一下。

?

轉載于:https://www.cnblogs.com/Loyalty/archive/2012/04/24/2469050.html

總結

以上是生活随笔為你收集整理的【转载】创建型-工厂方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。