【重溫設計模式】——從工廠方法模式看抽象類和介面的區別
阿新 • • 發佈:2019-02-02
引言
最近我們有集體學習了設計模式,不論是通過我們自己討論還是聽師哥師姐們的分享, 這個的收穫是非常大的,這一次學習設計模式感到非常的親切,可能是因為裡面有一些 模式在自己的專案中已經用到了,像抽象工廠、單例等,不管我們以前用的對還是不 對,這一次我們還是對以前在專案中用到過的設計模式更加的熟悉,所以總結一句話, 我們在平常的編碼過程中應該多用一些設計模式,這樣我們才能更好的理解設計模式的 精髓。 在講解三個工廠的時候自己終於對介面和抽象類有了更深的理解,在這和大家分享一 下,如果我理解的有錯請大家指出。 工廠方法類圖 工廠方法:定義一個用於建立物件的藉口,讓子類決定例項化哪一個類,工廠方法使一{ 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();
}
}
答:如果我們當我們子類沒有擴充套件父類的方法的時候,這樣寫是完全可以的,但是我們 大家都知道,子類繼承父類的時候是可以擴充套件自己擁有的功能的,如果一旦子類有了自 己獨自的功能,上面的寫法就錯了。因為這樣例項化的結果是隻能呼叫父類中的方法, 子類的方法是不能被呼叫的。