下面这篇来讲一下设计模式当中非常重要的一个模式,工厂方法模式

讲工厂模式就不得不说一下简单工厂了,简单工厂就是定义一个工厂类,用来生产一些实例,而工厂模式的操作也是这样的,但是工厂方法模式,会将这个工厂继续进行细分,看一下下面的简单工厂与工厂方法模式的类图。


通过图大家可以看到,简单工厂就是一个大的工厂,他能生产除法类,乘法类,加法类,减法类,工厂类功能比较多,但是写起来比较简单。而工厂方法模式,是将工厂继续细分四个工厂,分别为加减乘除工厂,用来生产加减乘除类。功能单一,但是代码繁琐。

如果系统完成以后,需求上又要增加一个开方类,这个时候,简单工厂就不符合开放封闭原则(作一个连接)了。所以工厂方法类这样使得职责更加的单一。每个小的工厂类所具有的功能更少,更加容易维护,扩展。更加的符合面向对象的思想。

下面举一个工厂方法的例子,

//运算类     public class Operation     {         private double _numberA = 0;         private double _numberB = 0;         public double NumberA         {             get { return _numberA; }             set { _numberA = value; }         }         public double NumberB         {             get { return _numberB; }             set { _numberB = value; }         }         public virtual double GetResult()//虚方法         {             double result = 0;             return result;         }     }     //加减乘数类     class OperationAdd : Operation     {         public override double GetResult()         {             double result = 0;             result = NumberA + NumberB;             return result;         }     }      class OperationSub : Operation     {         public override double GetResult()         {             double result = 0;             result = NumberA - NumberB;             return result;         }     }     class OperationMul : Operation     {         public override double GetResult()         {             double result = 0;             result = NumberA * NumberB;             return result;         }     }     class OperationDiv : Operation     {         public override double GetResult()         {             double result = 0;             if (NumberB == 0)             {                 throw new Exception("除数不能为0");             }             result = NumberA / NumberB;             return result;         }     }
//工厂接口     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();         }     }
//客户端         static void Main(string[] args)         {             IFactory operFactory = new AddFactory();             Operation oper = operFactory.CreateOperation();             oper.NumberA = 1;             oper.NumberB = 2;             double result = oper.GetResult();             Console.WriteLine(result);         }

          这样将判断的工作交给客户端来做,不用实现将所有的类实例化好,而是需要那类,然后再去进行实例化。这样就会留有更多资源进行其他工作。当然最主要的还是因为工厂方法模式符合面向对象编程的思想,

        面向接口编程:设计模式的一个重要原则是针对接口编程,不要依赖实现类

        开闭原则(Open-Closed Principle,OCP) “Software entities should be open for extension,but closed for modification”。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。这句话说得略微有点专业,我们把它讲得更通俗一点,也就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功(Functions)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。

设计模式就是更好的去应用编程思想当中的原则。 希望此文章能都对您有帮助。