1. 程式人生 > >【重溫設計模式】——從工廠方法模式看抽象類和介面的區別

【重溫設計模式】——從工廠方法模式看抽象類和介面的區別

     引言

 最近我們有集體學習了設計模式,不論是通過我們自己討論還是聽師哥師姐們的分享, 這個的收穫是非常大的,這一次學習設計模式感到非常的親切,可能是因為裡面有一些 模式在自己的專案中已經用到了,像抽象工廠、單例等,不管我們以前用的對還是不 對,這一次我們還是對以前在專案中用到過的設計模式更加的熟悉,所以總結一句話, 我們在平常的編碼過程中應該多用一些設計模式,這樣我們才能更好的理解設計模式的 精髓。  在講解三個工廠的時候自己終於對介面和抽象類有了更深的理解,在這和大家分享一 下,如果我理解的有錯請大家指出。  工廠方法類圖       工廠方法:定義一個用於建立物件的藉口,讓子類決定例項化哪一個類,工廠方法使一
個類的例項化延遲到其子類。  下面給大家一個具體的例項類圖:         下面我們從程式碼中檢視抽象類和介面的區別:  1、工廠為介面的時候,程式碼如下   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;
      }
    }

 工廠介面:
  interface   IFactory
    {
      Operation CreateOperation();
    }

 具體加法類:
   public class OperationAdd:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }
    具體減法類:
   public class OperationSub:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }

加法工廠:
    class AddFactory:IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }

減法工廠:
  public  class  SubFactory:IFactory
    {

        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }



  main函式:
namespace 工廠方法
{
   public class Program
    {
       public  static void Main(string[] args)
        {
           <span style="color:#ff0000;"><strong>IFactory operFactory = new SubFactory();</strong></span>
           Operation oper = operFactory.CreateOperation();
           oper.NumberA = 1;
           oper.NumberB = 2;
           double result = oper.GetResult();
           Console.WriteLine(result);
        }
    }
}

 問題一、在main函式中我們例項化工廠的時候為什麼是IFactory?

 答:因為在這裡IFactory是個介面,其餘的SubFacory是實現了這個介面,也就是在實 現介面的時候,具體的實現類裡面的方法必須和介面一模一樣。所以說在這我們既可以 用具體的實現類SubFactory 也可以用IFactory,當我們用IFactory的時候更可以達到代 碼複用的效果,當我們想實現加法功能的時候,我們只需要將上面加粗的程式碼後面的 Subfactory更改為Addfactory即可。

 問題二:如果我們將IFactory這個介面換成抽象類,是否還可以像上面程式碼那樣寫?

 程式碼如下:
{
  public abstract class   IFactory
    {
     public abstract Operation CreateOperation();
    }
}

 答:如果我們當我們子類沒有擴充套件父類的方法的時候,這樣寫是完全可以的,但是我們 大家都知道,子類繼承父類的時候是可以擴充套件自己擁有的功能的,如果一旦子類有了自 己獨自的功能,上面的寫法就錯了。因為這樣例項化的結果是隻能呼叫父類中的方法, 子類的方法是不能被呼叫的。

 從上面的例子中我們得出以下結論:

  1、抽象類可以給出一些成員的實現(像例子中的operation類),而介面卻不包含成 員的實現。   2、抽象類的抽象成員可被子類部分實現,介面的成員需要實現類完全實現。   3、一個類只能是按一個抽象類,但可以實現過個介面   4、如果行為擴約不同累的物件,可使用介面;對於一些相似類的物件,用繼承抽象 類。   5、從設計的角度看,抽象類是從子類中發現了公共的東西,泛化出了父類,然後子類 繼承父類,而介面是根本不值子類的存在,發發如何實現還不確認,預先定義。

 小結

 通過這次重溫設計模式的活動自己收穫了很多,對以前不是很懂的知識有了更好的理 解,並且接觸到了很多的新名詞,這些名詞自己在專案中也遇到過,像動態代理,AOP 等,但是通過聽師哥們分享和自己總結,又有了一個大的進步,其實學習就是這樣我們 需要反覆的學習,但是每一次都要有新的收穫,這樣才更有意義。