簡短 的兩句詩 大概就可以概括我此刻學習的心情了吧! 開始大話設計模式這本書的第一章,時間並不長,但對於自己的寫代碼能力,真是得到了很深的認識,原來代碼不是寫出來了就行的,對於代碼的要求我還差很多-------大話第一章 簡單工廠模式,用小例子一步一步由淺入深的告訴我代碼中的一些學問,而這些就是我所欠缺的。 比如開篇的例子,寫一個簡單的計算機程序 附加代碼如下: [csharp] <span style="font-family:KaiTi_GB2312;font-size:18px;">classProgram { static void Main(string[] args) { Console.Write("請輸入數字A:"); //命名不規范 string A = Console.ReadLine(); Console.Write("請輸入運算符號(+、-、*、/)"); string B = Console.ReadLine(); Console.Write("請輸入數字C:"); string C = Console.ReadLine(); string D = ""; if (B =="+") //程序繁瑣,這樣寫意味著每個條件都要判斷一下,才能執行, D =Convert.ToString(Convert.ToDouble (A) + Convert.ToDouble(C)); if (B == "-") D =Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C)); if (B == "*") D =Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C)); if (B == "/") D =Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C)); //如果除數為0就會報錯,那該怎麼辦 Console.WriteLine("結果是:" + D); } } </span> 注: 如果是我去寫 我會這麼寫,但是這其中就有好多不規范的地方 例如命名不規范,程序繁瑣,等等! 這都是初學者的毛病吧! 代碼寫好了,但是沒有考慮到他的擴展性 靈活性,復用性等等,這樣的代碼還真挺可怕! 此刻我也明白了耦合的含義,一個好的程序就是要低耦合,這樣才容易維護和擴展吧! 第一章由淺入深的寫,看到最後才理解了點什麼是簡單工廠模式,以及這樣的好處!下面我就來一一的記錄一下! 簡單工廠模式 簡單工廠模式又稱為靜態工廠方法模式屬於類的創建型模式 而它的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類的實例。 也就是生產你要創建的實體對象 。簡單工廠模式實際上不屬於23個GOF模式,但他可以作為工廠方法模式的一個引導. 我個人對此的理解:我覺的這就像是生活中的我們想定做某件衣服,於是我們去商店描述了我們的需求,然後商店把我們的需求交給工廠 進而做出我們需要的衣服,這裡面的商店就相當於我們的Clothes 類,我們的需求就是方法類,商家創建這樣一個需求方法 ,交給工廠,工廠就繼承商家提供的方法類去做就可以。 也許你會認為就一件衣服有那麼麻煩嗎 又商家又工廠的,假如說定衣服的多了,中間就會出現各種各樣的問題,例如衣服大小啦,顏色啦,等等,這種情況下簡單工廠模式就出來了,我們可以很方便的去處理哪方面出現了問題,各司其職。這也就符合了低耦合的原則了吧 在簡單工廠模式中的一些概念 工廠--------角色 簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類可以被外界直接調用,創建所需的產品對象。 抽象產品----------角色 簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。 具體產品---------角色 是簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例。 利用簡單工廠模式的優點 工廠類是整個模式的關鍵.包含了必要的邏輯判斷,根據外界給定的信息,決定究竟應該創建哪個具體類的對象.通過使用工廠類,外界可以從直接創建具體產品對象的尴尬局面擺脫出來,僅僅需要負責“消費”對象就可以了。而不必管這些對象究竟如何創建及如何組織的.明確了各自的職責和權利,有利於整個軟件體系結構的優化。 缺點 由於工廠類集中了所有實例的創建邏輯,違反了高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類中;它所能創建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。 當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利; 這些缺點在工廠方法模式中得到了一定的克服。 使用范圍 工廠類負責創建的對象比較少; 客戶只知道傳入工廠類的參數,對於如何創建對象(邏輯)不關心; 由於簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用。 專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類. [csharp] <span style="font-family:KaiTi_GB2312;font-size:18px;">static void main(string[] args) //主函數中簡單的調用 { Operation oper; oper =OperationFactory.createOperate("+"); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult(); Console.WriteLine(oper.GetResult()); } } public classOperation //主類中 獲取數字A.B 和 結果 { private double _numberA=0; private double _numberB = 0; public double NumberA { get { return _numberA ;} set { _numberA = value; } } public double NumberB { get { return _numberB; } set { _numberB = value; } } public virtual double GetResult() { double result = 0; return result; } } classOperationAdd : Operation //加法 { public override double GetResult() { double result = 0; result= NumberA+NumberB ; return result ; } } classOperationSub : Operation //減法 { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } classOperationMul : Operation //乘法 { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } class OperationDiv:Operation //除法 繼承了主運算類 { public override double GetResult() { double result = 0; if(NumberB == 0) // 寫一個主類 也就是運算的數字和方法,然後再寫每個方法的時候去繼承重新寫這些方法就可以了 thrownew Exception("除數不能為0"); result = NumberA / NumberB; return result; } } public classOperationFactory ///創建了一個工廠,用戶已輸入符號,工廠就會判斷怎麼計算了 { public static OperationcreateOperate(string operate) { Operation oper = null; switch (operate) { case "+": oper = new OperationAdd(); break; www.2cto.com case "-": oper = new OperationSub(); break; case "*": oper = new OperationMul(); break; case "/": oper = new OperationDiv(); break; } return oper; } } } </span>