1. 程式人生 > >簡單工廠 工廠方法 抽象工廠 使用方法與區別

簡單工廠 工廠方法 抽象工廠 使用方法與區別

簡單工廠:是由一個工廠物件決定創建出哪一種產品類的例項。

A例項呼叫B例項的方法,稱為A依賴於B。如果使用new關鍵字來建立一個B例項(硬編碼耦合),然後呼叫B例項的方法。一旦系統需要重構:需要使用C類來代替B類時,程式不得不改寫A類程式碼。而用工廠模式則不需要關心B物件的實現、建立過程。


  1. //抽象產品
  2.    publicabstractclass Car  
  3.    {  
  4.        publicabstractvoid Drive();  
  5.    }  
  6.    //具體產品
  7.    publicclass Benz : Car  
  8.    {  
  9.        publicoverridevoid Drive()  
  10.        {  
  11.            Console.WriteLine("開賓士");  
  12.        }  
  13.    }  
  14.    //具體產品
  15.    publicclass Bmw : Car  
  16.    {  
  17.        publicoverridevoid Drive()  
  18.        {  
  19.            Console.WriteLine("開寶馬");  
  20.        }  
  21.    }  
  22.    //簡單工廠
  23.    publicclass Driver  
  24.    {  
  25.        publicstatic Car DriveCar(string carName)  
  26.        {  
  27.            Car cc;  
  28.            if (carName == "賓士")  
  29.            {  
  30.                cc = new Benz();  
  31.            }  
  32.            else
  33.            {  
  34.                cc = new Bmw();  
  35.            }  
  36.            return cc;  
  37.        }  
  38.    }  
  39.    //客戶
  40.    publicclass Boss  
  41.    {  
  42.        Car cars = Driver.DriveCar("賓士");  
  43.        cars.Drive();  
  44.        Car cars2 = Driver.DriveCar("寶馬");  
  45.        cars2.Drive();  
  46.    }  

使用簡單工廠模式的優勢:讓物件的呼叫者和物件建立過程分離,當物件呼叫者需要物件時,直接向工廠請求即可。從而避免了物件的呼叫者與物件的實現類以硬編碼方式耦合,以提高系統的可維護性、可擴充套件性。工廠模式也有一個小小的缺陷:當產品修改時,工廠類也要做相應的修改,違反了開-閉原則。如上例,需要增加 奧迪 時,需要修改工廠類 Driver

簡單工廠模式適用於業務簡單的情況下或者具體產品很少增加的情況。而對於複雜的業務環境可能不太適應了。這就應該由工廠方法模式來出場了!!

工廠方法:

不在工廠類中進行邏輯判斷,程式可以為不同產品類提供不同的工廠,不同的工廠類和產不同的產品。當使用工廠方法設計模式時,物件呼叫者需要與具體的工廠類耦合


  1. //抽象產品
  2.     publicabstractclass Car  
  3.     {  
  4.         publicabstractvoid Drive();  
  5.     }  
  6.     //具體產品
  7.     publicclass Benz : Car  
  8.     {  
  9.         publicoverridevoid Drive()  
  10.         {  
  11.             Console.WriteLine("開賓士");  
  12.         }  
  13.     }  
  14.     //具體產品
  15.     publicclass Bmw : Car  
  16.     {  
  17.         publicoverridevoid Drive()  
  18.         {  
  19.             Console.WriteLine("開寶馬");  
  20.         }  
  21.     }  
  22.     //抽象工廠
  23.     publicabstractclass Driver  
  24.     {  
  25.         publicabstract Car DriveCar();  
  26.     }  
  27.     //具體工廠
  28.     publicclass DriverBenz: Driver  
  29.     {  
  30.         publicoverride Car DriveCar()  
  31.         {  
  32.             Car c = new Benz();  
  33.             return c;  
  34.         }  
  35.     }  
  36.     //具體工廠
  37.     publicclass DriverBmz : Driver  
  38.     {  
  39.         publicoverride Car DriveCar()  
  40.         {  
  41.             Car c = new Bmw();  
  42.             return c;  
  43.         }  
  44.     }  
  45.     //客戶
  46.     publicclass Boss  
  47.     {  
  48.         Driver dbenz = new DriverBenz();  
  49.         Car c = dbenz.DriveCar();  
  50.         c.Drive();  
  51.     }  

使用開閉原則來分析下工廠方法模式。當有新的產品產生時,只要按照抽象產品角色、抽象工廠角色提供的合同來生成,那麼就可以被客戶使用,而不必去修改任何已有的程式碼。(即當有新產品時,只要建立並基礎抽象產品;新建具體工廠繼承抽象工廠;而不用修改任何一個類)工廠方法模式是完全符合開閉原則的!

抽象工廠模式:

先來認識下什麼是產品族: 位於不同產品等級結構中,功能相關聯的產品組成的家族。
圖中的BmwCar和BenzCar就是兩個產品樹(產品等級結構);而如圖所示的BenzSportsCar和BmwSportsCar就是一個產品族。他們都可以放到跑車家族中,因此功能有所關聯。同理BmwBussinessCar和BenzBusinessCar也是一個產品族。
可以這麼說,它和工廠方法模式的區別就在於需要建立物件的複雜程度上。而且抽象工廠模式是三個裡面最為抽象、最具一般性的。抽象工廠模式的用意為:給客戶端提供一個介面,可以建立多個產品族中的產品物件。
而且使用抽象工廠模式還要滿足一下條件:
1.系統中有多個產品族,而系統一次只可能消費其中一族產品
2.同屬於同一個產品族的產品以其使用。
來看看抽象工廠模式的各個角色(和工廠方法的如出一轍):
抽象工廠角色: 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。它由抽象類或者介面來實現。
具體工廠角色:它含有和具體業務邏輯有關的程式碼。由應用程式呼叫以建立對應的具體產品的物件。
抽象產品角色:它是具體產品繼承的父類或者是實現的介面。一般有抽象類或者介面來實現。
具體產品角色:具體工廠角色所建立的物件就是此角色的例項。由具體的類來實現。


  1. //抽象產品
  2.     publicabstractclass BenzCar  
  3.     {  
  4.         publicabstractvoid Drive();  
  5.     }  
  6.     //具體產品
  7.     publicclass BenzSportCar : BenzCar  
  8.     {  
  9.         publicoverridevoid Drive()  
  10.         {  
  11.             Console.WriteLine("開賓士");  
  12.         }  
  13.     }  
  14.     //具體產品
  15.     publicclass BenzBusinessCar : BenzCar  
  16.     {  
  17.         publicoverridevoid Drive()  
  18.         {  
  19.             Console.WriteLine("開賓士");  
  20.         }  
  21.     }  
  22.     //抽象產品
  23.     publicabstractclass BmwCar  
  24.     {  
  25.         publicabstractvoid Drive();  
  26.     }  
  27.     //具體產品
  28.     publicclass BmwSportCar : BmwCar  
  29.     {  
  30.         publicoverridevoid Drive()  
  31.         {  
  32.             Console.WriteLine("開寶馬");  
  33.         }  
  34.     }  
  35.     //具體產品
  36.     publicclass BmwBusinessCar : BmwCar  
  37.     {  
  38.         publicoverridevoid Drive()  
  39.         {  
  40.             Console.WriteLine("開寶馬");  
  41.         }  
  42.     }  
  43.     //抽象工廠
  44. 相關推薦

    簡單工廠 工廠方法 抽象工廠 使用方法區別

    簡單工廠:是由一個工廠物件決定創建出哪一種產品類的例項。A例項呼叫B例項的方法,稱為A依賴於B。如果使用new關鍵字來建立一個B例項(硬編碼耦合),然後呼叫B例項的方法。一旦系統需要重構:需要使用C類來代替B類時,程式不得不改寫A類程式碼。而用工廠模式則不需要關心B物件的實現

    Note8:C#設計模式—工廠方法模式(VS 簡單工廠模式 & 抽象工廠模式)

    工廠方法模式 blog 抽象工廠 nbsp strong str cnblogs note 設計 一、資源說明 (1)本文有參考:http://www.cnblogs.com/zhili/p/FactoryMethod.html 待更!Note8:C#設計模式—工廠方法

    建立型模式-工廠相關模式 詳解設計模式之工廠模式(簡單工廠+工廠方法+抽象工廠)

      這裡我們來說一下簡單工廠,工廠方法,抽象工廠   可以看這篇文章:詳解設計模式之工廠模式(簡單工廠+工廠方法+抽象工廠)   簡單工廠   先說說簡單工廠,簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一   看程

    設計模式之工廠模式(工廠方法模式、簡單工廠模式、抽象工廠模式)

    工廠模式 工廠模式是最常用的設計模式之一,這種型別的設計模式屬於建立設計模式,它提供了一種建立物件的最佳方式。 優點:1、一個呼叫者想建立一個物件,只要知道其名稱就可以了。 2、擴充套件性高,如果想要增加多一個產品,只要擴充套件一個工廠類就可以了。 3、隱蔽產品的具體實現,呼叫者只要關係產品的介面。 程

    簡單工廠 工廠方法 抽象工廠 瞭解一下

    簡單工廠:工廠可以建立同一系列的產品,產品的介面一致,但工廠就要根據引數進行判斷到底建立哪種產品(簡單工廠沒有子類,一般來說直接在工廠裡面通過列舉來建立例項)。 比如:麵館有洋蔥面,牛肉麵,雞蛋麵...你要吃哪種面,就要根據你的口味決定。 工廠方法:可以有多種工廠,工廠有共同的介面,一個工廠只能

    三兄弟模式 —簡單工廠&工廠方法&抽象工廠

    最近學習設計模式時,遇到了“三兄弟模式”,這三個傢伙可把我搞暈了,通過查閱資料和個人理解,整理出了這篇文章,希望能幫到大家。 簡單工廠: 簡單工廠模式中,包括一個“抽象產品類”(該類可以是介面Inte

    簡單工廠模式、工廠方法模式、反射工廠模式、抽象工廠模式

            工廠模式在當初學習.net時就聽說過,記得當初實習的簡歷上寫著熟悉三層架構和工廠模式,其實當初並不會,只是聽說過。直到前些時候才去瞭解工廠模式,其實工廠模式還是很常用的,參考大話設計模式和網上的若干部落格,初步整理出四種版本的,簡單工廠模式、工廠模式、改進的

    KFC簡易點餐(工廠方法+抽象工廠

    package com.product; public interface product { } package com.product; public interface drinks extends product { } package co

    一(3)抽象工廠模式&&簡單工廠+反射改進抽象工廠

    reat end ssi 一行代碼 rate imp 缺點 接口 ner 1 抽象工廠?   抽象工廠用在既有產品樹,又有產品族的場合。     產品樹:奔馳旗下的跑車和商務車構成產品樹    產品族:奔馳旗下的跑車與奧迪旗下的跑車構成產品族。/*缺點:此時如果需要增加一個

    簡單工廠模式、工廠模式、抽象工廠模式

    alt 缺陷 關心 display img ret blog readline == 1.簡單工廠模式:調用類只需要向工廠類請求方法,由工廠決定創建出哪個類的實例,而不需要關心被調用類的實現過程。 優勢:調用類 和 被調用類分離,調用類需要時只需要向工廠請求,避免了調用類

    簡單工廠模式、工廠模式和抽象工廠模式區別

    下面例子中滑鼠,鍵盤,耳麥為產品,惠普,戴爾為工廠。 簡單工廠模式(面向單個產品,不符合開閉原則,要點:產品面向介面) 簡單工廠模式不是 23 種裡的一種,簡而言之,就是有一個專門生產某個產品的類。 比如下圖中的滑鼠工廠,專業生產滑鼠,給引數 0,生產戴爾滑鼠,給引數

    簡單工廠工廠模式和抽象工廠

      工廠可以分為三種:簡單工廠、工廠模式和抽象工廠,三者的關係是遞進的,以做包子為例,剛開始只有兩種包子:豆腐包和牛肉包,可以使用簡單工廠(或者叫靜態工廠)來解決,隨著包子種類的越來越多,發現沒新增一種包子,就需要改工廠類,擴充套件性太差,因此出現了工廠模式,提取一個公共的做包子介面,然後針對每一種包子建一個

    工廠模式,簡單工廠模式,抽象工廠模式

    說到這幾個工廠模式有很多相似之處又有不同。最重要的是掌握這種思想,在以後搭建專案架構或寫一些功能,應用這些思想,讓自己的程式更健壯,或者說當你看到別人寫的程式應用到了這種思想能夠快速理解。話不多說,咱們先從入門級的小案例講起。 一.簡單工廠模式 基本概念:簡單工廠模式是由一個工廠類根據接受到的訊息決定要建

    設計模式學習 ——簡單工廠模式、工廠模式、抽象工廠模式

    【轉】設計模式學習(二)——簡單工廠模式、工廠模式、抽象工廠模式 最近抽時間將之前看過的“程式人生”公眾號推送的一篇工廠模式的介紹進行了實踐,為了加深自己理解,特將自己的學習理解記錄於此。初識設計模式,就被設計模式的精妙深深吸引,感覺脫離設計模式的程式碼就失去了美麗。作為一個測試,平日寫程式碼的機會肯定不如開

    iOS 三種工廠模式(簡單工廠模式、工廠模式、抽象工廠模式)

    原文轉載 說明:在我理解中,這裡所謂的抽象,其實就是制定某一個介面規範。具體體現在程式碼裡,就是設定一個基類,基類遵守某一套介面規範,但是其具體的實現則通過子類化來完成。當然,這裡我們也可以使用協議來規範這套介面規範。相對的,具體就是具有對抽象做子類化之後產生的實體。 1

    簡單工廠工廠模式,抽象工廠

    學習了一下關於工廠的設計模式,寫個例子整理一下,例子是生產不同廠商的滑鼠,可能不太合適,記錄一下想法。 1.簡單工廠 這個模式在factory裡面動態選擇使用哪個類 public class Factory { public static Made g

    簡單工廠模式,工廠模式和抽象工廠區別

    簡單工廠模式簡單工廠模式不是23種裡的一種,簡而言之,就是有一個專門生產某個產品的類。比如下圖中的滑鼠工廠,專業生產滑鼠,給引數0,生產戴爾滑鼠,給引數1,生產惠普滑鼠。工廠模式工廠模式也就是滑鼠工廠是個父類,有生產滑鼠這個介面。戴爾滑鼠工廠,惠普滑鼠工廠繼承它,可以分別生產

    工廠模式和抽象工廠模式總結比較(屌絲專用)

    屌絲有了造錢工廠,神馬都是浮雲。 工廠模式(工廠方法模式): 一個抽象Money(產品類)派生出BlueMoney、RedMoney(多個具體產品類) 一個抽象MoneyFactory(工廠類)派生出BlueMoneyFactory、MoneyFactory(多個具體工廠

    結合Java反射用簡單工廠模式改進抽象工廠模式

    前一篇簡單介紹了抽象工廠模式,結合Java的反射機制,可以用簡單工廠模式來改進抽象工廠模式,減少類的數量,增加可維護性。UML圖如下: 去除IFactory、SqlserverFactory和AccessFactory三個工廠類,取而代之的是DataAccess類,用一

    簡單工廠模式、工廠模式和抽象工廠模式區別及優缺點

    各位小夥伴好,今天給大家主要介紹一下簡單工廠模式、工廠模式和抽象工廠模式的區別及各自的優缺點。 (本文實現語言為Python3) 【前言】 眾所周知今天所講的內容是設計模式的一類;對於設計模式這個概念,我想首先請大家問問自己:1、什麼是設計模式 2、我們為什麼要了解並學習設計模式? 從我上學的時候我相信大家跟