Factory Method

Factory Method(工厂方法)模式主要是为了隐藏对象创建这一任务的复杂性。客户通常不指定需要创建的具体类;客户通常面向接口或抽象类编程。让Factory类来负责创建具体的类型。通常Factory类有一个返回抽象类或者接口的静态方法。客户通常(并非总是)提供某种信息,然后Factory类使用提供的信息来确定创建并返回哪一个子类。

将创建子类的责任抽象出来所带来的好处是:

  1、允许客户代码完全无需考虑依赖类是如何创建的,遵循DIP(Dependency Inversion Principle)。

  2、把负责对象创建的代码集中起来,如果需要修改对象的生成方式,可以轻松定位并更新,而不会影响到依赖它的代码。

    class Program
    {
        static void Main(string[] args)
        {
            IFactory operFactory = new AddFactory();有别于简单工厂中OperationFactory.CreateOperate("+");后期项目中可以使用AutoFac来解决new的问题。
            Operation oper = operFactory.CreateOperation();从简单工厂中的一步,拆成了两步来生成所需的对象;Operation是抽象类,这里就面向了抽象类进行编程。
            oper.NumberA = 1;
            oper.NumberB = 2;
            Console.WriteLine(oper.GetResult());
            Console.Read();
        }
    }

    interface IFactory
    {
        Operation CreateOperation();
    }

    class AddFactory:IFactory
    {
        public Operation CreateOperation() {
            return new OperationAdd();
        }
    }

    class SubFactory:IFactory
    {
       public Operation CreateOperation(){
           return new OperationSub();
        }
    }

    class MulFactory:IFactory
    {
        public Operation CreateOperation() {
            return new OperationMul();
        }
    }

    class DivFactory:IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }

    public abstract class Operation
    {
        public double NumberA { get; set; }
        public double NumberB { get; set; }
        public abstract double GetResult();
    }

    class OperationAdd:Operation
    {
        public override double GetResult()
        {
            return NumberA + NumberB;
        }
    }

    class OperationSub:Operation
    {
        public override double GetResult()
        {
            return NumberA - NumberB;
        }
    }

    class OperationMul:Operation
    {
        public override double GetResult()
        {
            return NumberA * NumberB;
        }
    }

    class OperationDiv : Operation
    {
        public override double GetResult()
        {
            return NumberA / NumberB;
        }
    }

工厂方法和简单工厂有些相似,最主要不同的地方就是在于:

简单工厂通过一个工厂类(OperationFactory)来创建对象,而工厂方法则是通过特定的方法来创建对象。

IFactory operFactory = new AddFactory();
针对上面的这条 new AddFactory(),在实际项目中,可以使用AutoFac 这一类的IOC框架来解决主动new的问题。

 

posted @ 2019-09-25 14:53  水墨晨诗  阅读(204)  评论(0编辑  收藏  举报