抽象工廠
其實一個簡單的計算器就足夠了,但是設計模式讓它變得越來越複雜了。
public interface ICalculator { decimal Invoke(params decimal[] args); } public class AddCal : ICalculator { public decimal Invoke(params decimal[] args) { return args.Aggregate((x, y) => x + y); } }
ICalculator calculator = new AddCal(); calculator.Invoke(1, 2, 3, 4, 5);
上面程式碼忽略減乘除實現,面向對象思維入門級程式碼。
面向對象感覺最難的應該就是處理對象與對象之間的關係,而這個所謂關係正好就覆蓋到了整個項目的全部。為什麼現在不用面向過的思維來解決問題,一個道理吧。簡單or複雜都有自己的代價。
抽象工廠程式碼實現如下:
public delegate int CalculateHandler(params int[] items); public interface IF<T> { public T Create(); } public class Calculate { public int Add(params int[] items) { return items.Aggregate((x, y) => x + y); } } public class CalculateF : IF<CalculateHandler> { private Calculate _calculate; public CalculateF(Calculate calculate) { _calculate = calculate; } public CalculateHandler Create() { return _calculate.Add; } }
IF<CalculateHandler> ch = new CalculateF(new Calculate()); var result = ch.Create(); Trace.WriteLine(result.Invoke(1, 2, 3, 4, 5));
這裡的實現其實跟上面的ICalculator的介面實現是一回事,只不過在具體的實現層面加了一層判斷,把創建類封裝起來了,通過參數注入,這裡複雜的部分還是怎麼去抽象出來實體類,畢竟不是結果或者行為型模式,關注點還是在於對象的創建。
所以客戶端程式碼比上面對了一層new對象。
這個程式碼可以繼續衍生一下才能體現出來抽象工廠的優勢,要不然就用開頭的第一種了,簡單又方便:
public interface IF<in M,out T> { T Create(M cal); } //多元化 public class FI : IF<ICal,CalHandler> { public CalHandler Create(ICal cal) { return cal.Invoke; } } public interface ICal { decimal Invoke(params decimal[] args); } public delegate decimal CalHandler(params decimal[] args); public interface IPrint { void Print(string str); } public delegate void PrintHandler(string str); public class FII : IF<IPrint, PrintHandler> { public PrintHandler Create(IPrint cal) { return cal.Print; } } public class PrintScreen : IPrint { public void Print(string str) { Trace.WriteLine(str); } } public class AddCal : ICal { public decimal Invoke(params decimal[] args) { return args.Aggregate((x, y) => x = y); } }
IF<IPrint, PrintHandler> iFi = new FII(); IPrint print = new PrintScreen(); iFi.Create(print).Invoke("hello world"); IF<ICal, CalHandler> iFii = new FI(); ICal cal = new AddCal(); iFii.Create(cal).Invoke(1, 2, 3, 4, 5);
總結:
任何功能實現應該都離不開方法的執行,對象作為行為的載體,承載了太多的角色扮演,所以對象和對象之間的關係很複雜,學習設計模式應該是個捷徑。