抽象工廠

其實一個簡單的計算器就足夠了,但是設計模式讓它變得越來越複雜了。

 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);

總結:

任何功能實現應該都離不開方法的執行,對象作為行為的載體,承載了太多的角色扮演,所以對象和對象之間的關係很複雜,學習設計模式應該是個捷徑。