C 設計模式 2 簡單工廠模式

2021-06-27 08:59:09 字數 3193 閱讀 5525

說到簡單工廠,自然的第乙個疑問當然就是什麼是簡單工廠模式了? 在現實生活中工廠是負責生產產品的,同樣在設計模式中,簡單工廠模式我們也可以理解為負責生產物件的乙個類,我們平常程式設計中,當使用"new"關鍵字建立乙個物件時,此時該類就依賴與這個物件,也就是他們之間的耦合度高,當需求變化時,我們就不得不去修改此類的原始碼,此時我們可以運用物件導向(oo)的很重要的原則去解決這一的問題,該原則就是——封裝改變,既然要封裝改變,自然也就要找到改變的**,然後把改變的**用類來封裝,這樣的一種思路也就是我們簡單工廠模式的實現方式了。下面通過乙個現實生活中的例子來引出簡單工廠模式。

在外面打工的人,免不了要經常在外面吃飯,當然我們也可以自己在家做飯吃,但是自己做飯吃麻煩,因為又要自己買菜,然而,出去吃飯就完全沒有這些麻煩的,我們只需要到餐館點菜就可以了,買菜的事情就交給餐館做就可以了,這裡餐館就充當簡單工廠的角色,下面讓我們看看現實生活中的例子用**是怎樣來表現的。

自己做飯的情況:

///

///自己做飯的情況

///沒有簡單工廠之前,客戶想吃什麼菜只能自己炒的

/// public

class

customer

//我又想吃土豆肉絲, 這個還是得自己做

//我覺得自己做好累哦,如果能有人幫我做就好了?

else

if (type.equals("

土豆肉絲"))

return

food;

}static

void main(string

args)

}///

///菜抽象類

/// public

abstract

class

food

//////

西紅柿炒雞蛋這道菜

/// public

class

tomatoscrambledeggs : food

}//////

土豆肉絲這道菜

/// public

class

shreddedporkwithpotatoes : food

}

自己做飯,如果我們想吃別的菜時,此時就需要去買這種菜和洗菜這些繁瑣的操作,有了餐館(也就是簡單工廠)之後,我們就可以把這些操作交給餐館去做,此時消費者(也就是我們)對菜(也就是具體物件)的依賴關係從直接變成的間接的,這樣就是實現了物件導向的另乙個原則——降低物件之間的耦合度,下面就具體看看有了餐館之後的實現**(即簡單工廠的實現):

///

///顧客充當客戶端,負責呼叫簡單工廠來生產物件

///即客戶點菜,廚師(相當於簡單工廠)負責燒菜(生產的物件)

/// class

customer

}//////

菜抽象類

/// public

abstract

class

food

//////

西紅柿炒雞蛋這道菜

/// public

class

tomatoscrambledeggs : food

}//////

土豆肉絲這道菜

/// public

class

shreddedporkwithpotatoes : food

}//////

簡單工廠類, 負責 炒菜

/// public

class

food******factory

else

if (type.equals("

西紅柿炒蛋"))

return

food;}}

看完簡單工廠模式的實現之後,你和你的小夥伴們肯定會有這樣的疑惑(因為我學習的時候也有)——這樣我們只是把變化移到了工廠類中罷了,好像沒有變化的問題,因為如果客戶想吃其他菜時,此時我們還是需要修改工廠類中的方法(也就是多加case語句,沒應用簡單工廠模式之前,修改的是客戶類)。我首先要說:你和你的小夥伴很對,這個就是簡單工廠模式的缺點所在(這個缺點後面介紹的工廠方法可以很好地解決),然而,簡單工廠模式與之前的實現也有它的優點:

雖然上面已經介紹了簡單工廠模式的缺點,下面還是總結下簡單工廠模式的缺點:

了解了簡單工廠模式之後的優缺點之後,我們之後就可以知道簡單工廠的應用場景了:

簡單工廠模式又叫靜態方法模式(因為工廠類都定義了乙個靜態方法),由乙個工廠類根據傳入的引數決定建立出哪一種產品類的例項(通俗點表達:通過客戶下的訂單來負責燒那種菜)。簡單工廠模式的uml圖如下:

介紹完了簡單工廠模式之後,我學習的時候就像:.net類庫中是否有實現了簡單工廠模式的類呢?後面確實有,.net中system.text.encoding類就實現了簡單工廠模式,該類中的getencoding(int codepage)就是工廠方法具體的**可以通過reflector反編譯工具進行檢視,下面我也貼出該方法中部分**:

.net 中encoding的uml圖為:

encoding類中實現的簡單工廠模式是簡單工廠模式的一種演變,此時簡單工廠類由抽象產品角色扮演,然而.net中encoding類是如何解決簡單工廠模式中存在的問題的呢(即如果新新增一種編碼怎麼辦)?在getencoding方法裡的switch函式有如下**:

switch

(codepage)

break

; ......

}

在getencodingrare方法裡有一些不常用編碼的例項化**,微軟正式通過這個方法來解決新增加一種編碼的問題。(其實也就是列出所有可能的編碼情況),微軟之所以以這樣的方式來解決這個問題,可能是由於現在編碼已經穩定了,新增新編碼的可能性比較低,所以在.net 4.5仍然未改動這部分**。

到這裡,簡單工廠模式的介紹都到這裡了,後面將介紹工廠方法模式來解決簡單工廠模式中存在的問題。

本專題中的全部原始碼:簡單工廠模式原始碼

c 設計模式(2) 簡單工廠模式

簡單工廠模式,也叫做靜態工廠模式,通過專門定義乙個類來負責其他類的建立,被建立的類通常有乙個共同的父類。1 工廠角色 是工廠模式的核心,負責建立例項物件內部的邏輯。可以被外界呼叫,建立所需要的產品。2 抽象產品 簡單工廠模式所建立產品的父類,負責描述產品的公共介面 3 具體產品 具體的例項物件 優缺...

C 設計模式 2 簡單工廠模式

這個系列也是自己對設計模式的一些學習筆記,希望對一些初學設計模式的人有所幫助的,在上乙個專題中介紹了單例模式,在這個專題中繼續為大家介紹乙個比較容易理解的模式 簡單工廠模式。說到簡單工廠,自然的第乙個疑問當然就是什麼是簡單工廠模式了?在現實生活中工廠是負責生產產品的,同樣在設計模式中,簡單工廠模式我...

設計模式(2) 簡單工廠模式

簡單工廠模式的實質是由乙個工廠類根據傳入的引數,動態決定應該建立哪乙個產品類 這些產品類繼承自乙個父類或介面 的例項。工廠 creator 角色 簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。工廠類的建立產品類的方法可以被外界直接呼叫,建立所需的產品物件。抽象產品 product 角色 簡單...