這個系列也是自己對設計模式的一些學習筆記,希望對一些初學設計模式的人有所幫助的,在上乙個專題中介紹了單例模式,在這個專題中繼續為大家介紹乙個比較容易理解的模式——簡單工廠模式。
說到簡單工廠,自然的第乙個疑問當然就是什麼是簡單工廠模式了? 在現實生活中工廠是負責生產產品的,同樣在設計模式中,簡單工廠模式我們也可以理解為負責生產物件的乙個類,我們平常程式設計中,當使用"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
}
/// /// 顧客充當客戶端,負責呼叫簡單工廠來生產物件看完簡單工廠模式的實現之後,你和你的小夥伴們肯定會有這樣的疑惑(因為我學習的時候也有)——這樣我們只是把變化移到了工廠類中罷了,好像沒有變化的問題,因為如果客戶想吃其他菜時,此時我們還是需要修改工廠類中的方法(也就是多加case語句,沒應用簡單工廠模式之前,修改的是客戶類)。我首先要說:你和你的小夥伴很對,這個就是簡單工廠模式的缺點所在(這個缺點後面介紹的工廠方法可以很好地解決),然而,簡單工廠模式與之前的實現也有它的優點:/// 即客戶點菜,廚師(相當於簡單工廠)負責燒菜(生產的物件)
///
class customer
}/// /// 菜抽象類
///
public abstract class food
/// /// 西紅柿炒雞蛋這道菜
///
public class tomatoscrambledeggs : food
}/// /// 土豆肉絲這道菜
///
public class shreddedporkwithpotatoes : food
}/// /// 簡單工廠類, 負責 炒菜
///
public class food******factory
else if (type.equals("西紅柿炒蛋"))
return food;}}
雖然上面已經介紹了簡單工廠模式的缺點,下面還是總結下簡單工廠模式的缺點:
了解了簡單工廠模式之後的優缺點之後,我們之後就可以知道簡單工廠的應用場景了:
簡單工廠模式又叫靜態方法模式(因為工廠類都定義了乙個靜態方法),由乙個工廠類根據傳入的引數決定建立出哪一種產品類的例項(通俗點表達:通過客戶下的訂單來負責燒那種菜)。簡單工廠模式的uml圖如下:
介紹完了簡單工廠模式之後,我學習的時候就像:.net類庫中是否有實現了簡單工廠模式的類呢?後面確實有,.net中system.text.encoding類就實現了簡單工廠模式,該類中的getencoding(int codepage)就是工廠方法,具體的**可以通過reflector反編譯工具進行檢視,下面我也貼出該方法中部分**:
public static encoding getencoding(int codepage).net 中encoding的uml圖為:if (unicode == null)
unicode = (encoding) encodings[codepage];
if (unicode != null)
switch (codepage)
), "codepage");
case 0x4b0:
unicode = unicode;
break;
case 0x4b1:
unicode = bigendianunicode;
break;
case 0x6faf:
unicode = latin1;
break;
case 0xfde9:
unicode = utf8;
break;
case 0x4e4:
unicode = new sbcscodepageencoding(codepage);
break;
case 0x4e9f:
unicode = ascii;
break;
default:
unicode = getencodingcodepage(codepage);
if (unicode == null)
break;
}encodings.add(codepage, unicode);
return unicode;}}
encoding類中實現的簡單工廠模式是簡單工廠模式的一種演變,此時簡單工廠類由抽象產品角色扮演,然而.net中encoding類是如何解決簡單工廠模式中存在的問題的呢(即如果新新增一種編碼怎麼辦)?在getencoding方法裡的switch函式有如下**:
switch (codepage)在getencodingrare方法裡有一些不常用編碼的例項化**,微軟正式通過這個方法來解決新增加一種編碼的問題。(其實也就是列出所有可能的編碼情況),微軟之所以以這樣的方式來解決這個問題,可能是由於現在編碼已經穩定了,新增新編碼的可能性比較低,所以在.net 4.5仍然未改動這部分**。break;
......
}
到這裡,簡單工廠模式的介紹都到這裡了,後面將介紹工廠方法模式來解決簡單工廠模式中存在的問題。
C 設計模式 2 簡單工廠模式
說到簡單工廠,自然的第乙個疑問當然就是什麼是簡單工廠模式了?在現實生活中工廠是負責生產產品的,同樣在設計模式中,簡單工廠模式我們也可以理解為負責生產物件的乙個類,我們平常程式設計中,當使用 new 關鍵字建立乙個物件時,此時該類就依賴與這個物件,也就是他們之間的耦合度高,當需求變化時,我們就不得不去...
c 設計模式(2) 簡單工廠模式
簡單工廠模式,也叫做靜態工廠模式,通過專門定義乙個類來負責其他類的建立,被建立的類通常有乙個共同的父類。1 工廠角色 是工廠模式的核心,負責建立例項物件內部的邏輯。可以被外界呼叫,建立所需要的產品。2 抽象產品 簡單工廠模式所建立產品的父類,負責描述產品的公共介面 3 具體產品 具體的例項物件 優缺...
設計模式(2) 簡單工廠模式
簡單工廠模式的實質是由乙個工廠類根據傳入的引數,動態決定應該建立哪乙個產品類 這些產品類繼承自乙個父類或介面 的例項。工廠 creator 角色 簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。工廠類的建立產品類的方法可以被外界直接呼叫,建立所需的產品物件。抽象產品 product 角色 簡單...