程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 代碼無錯就是優?----簡單工廠模式

代碼無錯就是優?----簡單工廠模式

編輯:C#入門知識

簡短 的兩句詩 大概就可以概括我此刻學習的心情了吧!  開始大話設計模式這本書的第一章,時間並不長,但對於自己的寫代碼能力,真是得到了很深的認識,原來代碼不是寫出來了就行的,對於代碼的要求我還差很多-------大話第一章  簡單工廠模式,用小例子一步一步由淺入深的告訴我代碼中的一些學問,而這些就是我所欠缺的。  比如開篇的例子,寫一個簡單的計算機程序 附加代碼如下: [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>    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved