首页 > 其他分享 >工厂模式

工厂模式

时间:2022-11-16 22:58:36浏览次数:41  
标签:return Calculator items decimal 模式 工厂 class public

工厂模式应该是用的频次最高的,他管理着对对象的创建。下面简单介绍下简单工厂、工厂方法、抽象工厂。

一、简单工厂应该是其中最简单最直接明了的,一个接口、N个实现,再一组装就好了。

 public interface ICalculator { decimal Calculator(params decimal[] items); }

    public class AddConcrete : ICalculator
    {
        public decimal Calculator(params decimal[] items)
        {
            return items.Aggregate((x, y) => x + y);
        }
    }

    public class SubConcrete : ICalculator
    {
        public decimal Calculator(params decimal[] items)
        {
            return items.Aggregate((x, y) => x - y);
        }
    }
    public class MulConcrete : ICalculator
    {
        public decimal Calculator(params decimal[] items)
        {
            return items.Aggregate((x, y) => x * y);
        }
    }
    
    public class DivConcrete : ICalculator
    {
        public decimal Calculator(params decimal[] items)
        {
            return items.Aggregate((x, y) => x / y);
        }
    }

    public enum Operator
    {
        Add,Sub,Mul,Div
    }

上面的代码应该是最底层的支柱,下面的代码就是简单工厂的精髓了,其中判断部分可以通过配置文件、反射或者其他的各种实现。

   public class SimpleFactory
    {
        public static decimal Calculator(Operator @operator,params decimal[] items)
        {
          
            switch (@operator)
            {
                case Operator.Add:
                    return new AddConcrete().Calculator(items);
                case Operator.Sub:
                    return new SubConcrete().Calculator(items);

                case Operator.Mul:
                    return new MulConcrete().Calculator(items);
                    
                case Operator.Div:
                    return new DivConcrete().Calculator(items);
                default:
                    throw new ArgumentNullException(nameof(Operator));
            }
        }
    }

 

客户端实现

SimpleFactory.Calculator(Operator.Add,1,2,3,4,5);

 

二、工厂方法

工厂方法应该是在抽象工厂这里重现包了一层,增加了代码的复杂度,三类工厂最大的区别应该是在于最高成模块的灵活性,也就是客户端上面的灵活扩展。

工厂方法代码如下,底层部分还是一样

 public interface ICalculator { decimal Calculator(params decimal[] items); }

    public class AddConcrete : ICalculator
    {
        public decimal Calculator(params decimal[] items)
        {
            return items.Aggregate((x, y) => x + y);
        }
    }

    public class SubConcrete : ICalculator
    {
        public decimal Calculator(params decimal[] items)
        {
            return items.Aggregate((x, y) => x - y);
        }
    }
    public class MulConcrete : ICalculator
    {
        public decimal Calculator(params decimal[] items)
        {
            return items.Aggregate((x, y) => x * y);
        }
    }
    
    public class DivConcrete : ICalculator
    {
        public decimal Calculator(params decimal[] items)
        {
            return items.Aggregate((x, y) => x / y);
        }
    }

    public enum Operator
    {
        Add,Sub,Mul,Div
    }

下面就是工厂方法的关键代码,首先引入了一个工厂接口IFactory

   public interface IFactory { ICalculator Create(); }

下面那把底层的代码套一层

   public class DivFactory : IFactory
    {
        public ICalculator Create()
        {
            return new DivConcrete();
        }
    }
    public class MulFactory : IFactory
    {
        public ICalculator Create()
        {
            return new MulConcrete();
        }
    }

    public class SubFactory : IFactory
    {
        public ICalculator Create()
        {
            return new SubConcrete();
        }
    }

    public class AddFactory : IFactory
    {
        public ICalculator Create()
        {
            return new AddConcrete();
        }
    }

 

客户端实现就是这样的了,需要什么工厂就在客户端直接造一个工厂,至于其他的工厂或者新增都不会影响原来的代码,扩展性优于简单工厂,简单工厂需要扩展的话会改变修改代码。但是老生常谈,扩展性好结构肯定会复杂一下。

IFactory addFactory = new AddFactory();

addFactory.Create().Calculator(1,2,3,4,5);

 

三、 抽象工厂

抽象工厂跟工厂方法基本上是一样的东西,他是负责一系列同类型的对象的创建。可以说工厂方法是抽象工厂的一个特例,工厂方法只负责创建一对一的对象。

因为抽象工厂通过计算器来实现已经不太合适,所以换个例子。

    public interface IProductX { }
    public interface IProductY { }
    public class ProductX_A : IProductX { }
    public class ProductX_B : IProductX { }
    public class ProductY_A : IProductY { }
    public class ProductY_B : IProductY { }

 

上面是两个接口,可以实现两类对象,有接口就会有对应的实现。下面的抽象工厂就负责分配实体类的实例。

  public interface IFactory
    {
        IProductX CreateXSeries();
        IProductY CreateYSeries();
    }

实现IFactory就是抽象工厂的职责,这里也是套一层逻辑,通过相同的业务输出同一类的工厂。

  public class FactoryB : IFactory
    {
        public IProductX CreateXSeries()
        {
            return new ProductX_B();
        }

        public IProductY CreateYSeries()
        {
            return new ProductY_B();
        }
    }

    public class FactoryA : IFactory
    {
        public IProductX CreateXSeries()
        {
            return new ProductX_A();
        }

        public IProductY CreateYSeries()
        {
            return new ProductY_A();
        }
    }

 

客户端实现,这里并不关系底层是什么,只是从factory层面去获取我们想要的product。只不过每个factory都会实现一些列的product,要么productX_A和ProductY_A,,要门ProductX_B和productY_B,这都是提前归类好的。

         IFactory factory = new FactoryA();
            var xa = factory.CreateXSeries();
            var ya = factory.CreateYSeries();

            factory = new FactoryB();
            var xb = factory.CreateXSeries();
            var yb = factory.CreateYSeries();

 

总结,这三类工厂关注点都是对象的创建,归类于创建型设计模式。类似的,我们不仅仅对对象进行抽象重建,还可以对方法也做抽象重建。

比如下面的代码,看过前面的应该很眼熟了

interface IFactory<T>{ T Create();}

public delegate decimal CalculateHandler(params decimal[] items);

class Calculator
{
  //实现略
  public decimal Add(params decimal[] items){ return 0;}

}

class CalculateHandlerFactory:IFactory<CalculateHandler>
{

  public CalculateHandler Create()
  {
    return new Calculator().Add;
  }
}

IFactory<CalculateHandler> factory = new  CalculateHandlerFactory();

factory.Create()(1,2,3,4);

标签:return,Calculator,items,decimal,模式,工厂,class,public
From: https://www.cnblogs.com/morec/p/16897837.html

相关文章

  • 06.适配器模式
    适配器模式作为两个不兼容的接口之间的桥梁结合了两个独立接口的功能例如实际中有个两孔的插座,现在需要有个三孔的插口,如果不直接在两孔的class修改,就需要加一个适配cla......
  • postgresql函数:定期删除模式下指定天数前的表数据及分区物理表
    一、现有函数--1、现有函数调用selectods.deletePartitionIfExists('fact_ship'||'_'||to_char(CURRENT_DATE-INTERVAL'2month','yyyymmdd'));--2、函数内容CREAT......
  • 设计模式 -- 工厂模式
    简单工厂模式简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式(静态工厂模式):定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)......
  • 设计模式 -- 单例模式
    介绍采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其实例对象的方法(静态方法)主要解决:一个全局使用的类频繁地创建与销毁。......
  • 解决Vue中使用history路由模式出现404的问题
    背景vue中默认的路由模式是hash,会出现烦人的符号#,如http://127.0.0.1/#/。改为history模式可以解决这个问题,但是有一个坑是:强刷新、回退等操作会出现404。Vue改用History......
  • 观察者模式
    前言观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模......
  • 软件设计模式白话文系列(十一)享元模式
    1、描述以共享的方法高效地支持大量细粒度对象的复用。在Java中,通过提前初始化对象或者首次使用后记录对象,后续使用就可以复用对象来实现享元模式。类似缓存技术。2、......
  • HeadFirst设计模式-观察者模式
    观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。   Java代码 c++代码#pragmaonce#include"......
  • 05.原型模式
    原型模式PrototypePattern用于创建重复的对象,同时又能保证性能。当需要创建一个与已有对象类似的对象,或者当创建对象的成本比克隆更高时,使用原型模式通过实现Clone方......
  • js闭包问题、js事件循环机制、async与defer、同步与异步模式
    js闭包问题定义:闭包就是有权访问其他函数作用域内的其他变量的函数。实现机制:在访问变量的函数中return一个匿名函数,这时匿名函数的作用域链将指向该函数的作用域。!!!由于......