国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

設計模式(1)---簡單工廠模式

2019-11-14 16:46:29
字體:
來源:轉載
供稿:網友

  引言:

  從接觸編碼到現在有一段時間了,總是在為一些基礎語法、技能而不斷學習,學著學著感覺有些茫然。在上一篇曾經說過一大牛的教誨:“c語言、java語言、C#語言這些都是一些基本的工具,而它們其中的語法、技能都是一些很簡單的基礎知識,剛接觸編碼時肯定會有很多的知識、技能你不懂,但你只要碰到并且學習肯定能夠熟練使用。所以語言、技能都不重要,重要的是脫離語言工具的思想,編程的思想。設計模式是思想的體現,多多學習肯定沒錯”。這之后一直在看設計模式方面的書,但“紙上得來終覺淺,絕知此事要躬行”,于是想把看的書、評論、博客等一些東西總結到一塊摘寫出來,加深印象同時方便學習。現在開始第一篇:簡單工廠模式。

  定義:

  定義一個類專門負責創建其他類的實例,具體創建什么實例由傳入的參數而決定,并且這些類都共同繼承于一個父類或者有共同的接口。簡單工廠模式是工廠模式家族中最簡單的一種實用模式,也可以說是不同工廠模式的一個特殊實現。

  簡單工廠符合面向對象重要原則之一:封裝改變。

 

  參與者:

  工廠角色Creator:模式的核心,負責創建所有實例,根據傳入的參數,決定創建什么類型的實例。

  抽象產品角色PRoduct:上述所有類的父類或者是接口。

  具體產品角色Concrete Product:由工廠類創建出來的具體的產品實例。

 

  UML圖:

  

 

  舉例說明:

  列舉大話設計模式中的一個計數器例子,制作一個計數器,進行加減乘除運算。

  

  抽象產品角色:父類(運算類) 

public class Operation    {        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;        }    }

  

  具體產品角色:子類(加減乘除) 

class OperationAdd : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA + NumberB;            return result;        }    }    class OperationSub : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA - NumberB;            return result;        }    }    class OperationMul : 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)            {                throw new Exception("除數不能為0");            }            result = NumberA / NumberB;            return result;        }    }

 

  工廠角色:建造各種實例

public class OperationFactory    {        public static Operation CreateOperate(string operate)        {            Operation operation = null;            switch (operate)            {                 case "+":                    operation = new OperationAdd();                    break;                case "-":                    operation = new OperationSub();                    break;                case "*":                    operation = new OperationMul();                    break;                case "/":                    operation = new OperationDiv();                    break;            }            return operation;        }    }

 

  客戶端調用: 

static void Main(string[] args)        {            Operation operation;            operation = OperationFactory.CreateOperate("-");            operation.NumberA = 3;            operation.NumberB = 7;            double result = operation.GetResult();            Console.WriteLine(result);            Console.ReadLine();        }

  

  到此,一個簡單的計數器實例編寫完畢。客戶端向工廠類傳入參數“-”,工廠類根據傳入的參數創建具體的產品實例,然后進行運算。

 

  簡單工廠模式優點:

  簡單工廠模式解決了客戶端直接依賴于具體對象的問題,客戶端可以消除直接創建對象的責任,而僅僅是消費產品。  低耦合,與外界具體產品類分開。

  實現代碼復用。

 

  缺點:

  違反了高內聚的原則,直接導致:如果需要創建新的類,也就必須改變工廠類。

  

  適用場合:

  適用于創建的對象比較少的情況;

  適用于客戶端只負責傳入參數而不關心創建實例的內部邏輯。

 

補充:

  看的設計模式第一個就是簡單工廠模式,但是實際項目中一直沒有用,前幾天一個同事為了解決項目問題用了簡單工廠模式,事后跟他一討論才知道,那哥們比較牛,沒有看過設計模式,就是根據自己的想象寫出一個小架構,符合簡單工廠模式。此處只是為了加速對簡單工廠模式的理解,大致講解該項目的系統框架。

該項目是:為了集合多廠商產品SDK而開發出來的一套產品,目前僅有A和B廠商的SDK。編寫簡單框架,滿足擴展要求,實現產品功能。

首先編寫一個接口類:

interface IMethod{   void method1();   void method2();      }

其次是A和B廠商都繼承IMethod接口:

class A:IMethod{  void method1()  {     //user ASDK          }     void method2()  {     //user ASDK          }      }class B:IMethod{  void method1()  {     //user BSDK          }     void method2()  {     //user BSDK          }  }

 

工廠類,即決定調用什么方法:

class Factory{    public char factorySDK;    public Factory(char factorySDK)    {         this.factorySDK = factorySDK;    }      public IMethod  CreateSDK(char factorySDK)    {           IMethod method = null;            switch(factorySDK)            {                     case ASDK:                            method = new  A();                             break;                       case BSDK:                            method = new  B();                             break;                      default:                               break;            }            return method;    }  

  public void Method1()
  {
    method.Method1();
  }

  
  public void Method2()
  {
    method.Method2();
  }

}

 

  如果下次需要把C廠商產品的SDK也集中進去,如果沒有新的需求,那么便不需要增加新的方法,只需要建造一個C類,繼承IMethod接口。同時在工廠類中新增一個new C即可。通過此項目,從理論方面學習設計模式進入到實際的項目實踐中去,雖然是看到別人寫的,但最自己也是一個不小的收獲。

 

 

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳泉市| 黎平县| 饶阳县| 噶尔县| 尼勒克县| 游戏| 昌都县| 青海省| 潞西市| 启东市| 汝阳县| 监利县| 盐池县| 玉山县| 工布江达县| 安徽省| 阿瓦提县| 新河县| 抚顺县| 专栏| 襄汾县| 岐山县| 海兴县| 青海省| 永嘉县| 延安市| 乌兰县| 台东市| 宁强县| 高青县| 都安| 金阳县| 黑河市| 德安县| 揭西县| 镇雄县| 台东市| 丹寨县| 正安县| 娄烦县| 祥云县|