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

  引言:java

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

  定義:設計模式

  定義一個類專門負責建立其餘類的實例,具體建立什麼實例由傳入的參數而決定,而且這些類都共同繼承於一個父類或者有共同的接口。簡單工廠模式是工廠模式家族中最簡單的一種實用模式,也能夠說是不一樣工廠模式的一個特殊實現。架構

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

 

  參與者:ide

  工廠角色Creator:模式的核心,負責建立全部實例,根據傳入的參數,決定建立什麼類型的實例。工具

  抽象產品角色Product:上述全部類的父類或者是接口。學習

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

 

  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便可。經過此項目,從理論方面學習設計模式進入到實際的項目實踐中去,雖然是看到別人寫的,但最本身也是一個不小的收穫。

相關文章
相關標籤/搜索