• 抽象工厂


    其实一个简单的计算器就足够了,但是设计模式让它变得越来越复杂了。

    复制代码
     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
        {
            public T Create();
    
        }
        public class Calculate
        {
            public int Add(params int[] items)
            {
                return items.Aggregate((x, y) => x + y);
            }
        }
        public class CalculateF : IF
        {
            private Calculate _calculate;
            public CalculateF(Calculate calculate)
            {
                _calculate = calculate;
            }
            public CalculateHandler Create()
            {
                return _calculate.Add;
            }
        }
    复制代码
     IF 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
        {
            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
        {
            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 iFi = new FII();
                IPrint print = new PrintScreen();
                iFi.Create(print).Invoke("hello world");
                IF iFii = new FI();
                ICal cal = new AddCal();
                iFii.Create(cal).Invoke(1, 2, 3, 4, 5);

    总结:

    任何功能实现应该都离不开方法的执行,对象作为行为的载体,承载了太多的角色扮演,所以对象和对象之间的关系很复杂,学习设计模式应该是个捷径。

     

  • 相关阅读:
    C++代码重用(二)
    图像处理:局部描述子SIFT算法
    使用node.js实现跨域请求
    Yii 知识点总结
    Web3中文|10月份超48%的以太坊NFT交易额是假的
    系分 - 系统分析
    VS Code下利用Cmake开发C++-单文件
    Linux命令详解(12)-crontab命令
    字节大咖面试经验诚意出品:微服务攻坚手册,助你向大厂迈进
    风控指南 | 风控引擎如何快速管理组件?
  • 原文地址:https://www.cnblogs.com/morec/p/16890059.html