首页 > 其他分享 >抽象工厂

抽象工厂

时间:2022-11-14 19:15:43浏览次数:38  
标签:Invoke decimal args public 抽象 new 工厂 Create

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

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

总结:

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

 

标签:Invoke,decimal,args,public,抽象,new,工厂,Create
From: https://www.cnblogs.com/morec/p/16890059.html

相关文章

  • 实景三维数字孪生工厂可视化对产业经济发展有重要意义
    大力推进工程生产过程数字化监控、管理、生产等数字化转型,对工厂经济发展具有重要意义,3D数字孪生智能工厂云交互系统借助web3d开发、数字孪生、三维交互、VR虚拟仿真等......
  • 顺通家用电器生产工厂ERP管理系统
    顺通家用电器生产工厂ERP管理系统是一款面向中小制造企业,以智能制造与精益管理为核心的一体化管理软件,符合行业特性的管理流程,与经营特征,形成行业化管理应用软件,为企业提供......
  • 工厂方法模式
    概述《设计模式》中对工厂方法模式的意图描述如下:定义一个创建对象的接口,让子类来决定实例化哪一个类。FactoryMethod使得一个类的实例化延迟到子类一般工厂方法模......
  • Java中的抽象类详解
    概述由来父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有方法主体的方......
  • java——继承与多态——抽象类001
    抽象的概念:          抽象方法和抽象类的格式:                抽象方法和抽象类的使用:       ......
  • 抽象1
    只要继承了抽象类,就要实现其内部所有的抽象方法。  把抽象类当成一个家,把抽象方法当成一个成员。  抽象类可以不需要抽象方法。抽象方法却必须要住在抽象类当......
  • 【Java复健指南12】OOP高级03-抽象类与接口
    抽象类引出问题:​ 父类方法有时候具有不确定性小结:当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类例子:publicclas......
  • 抽象类和接口的区别
    抽象类和接口都是为了将方法抽象然后让子类去实现,所以都可以定义抽象方法,都不能实例化本类对象抽象类可以实现接口,接口只能继承接口不能继承类一个类最多只能继承一个父类,......
  • 工厂模式
    工厂模式定义工厂类,及工厂方法,获取工厂里面的数据@Service@OrderpublicclassRuleFactory{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(R......
  • 工厂模式案例解释
    1.1工厂模式​ 工厂模式一般分为简单工厂、工厂方法、抽象工厂,那么什么是简单工厂模式?工厂方法?抽象工厂模式?先看例子,再去看概念和UML图。举例:假设现在有一个项目要......