您的位置:首页 > 其它

设计模式之工厂方法模式

2013-12-18 20:59 351 查看
上篇讲到装饰模式,下面这篇来讲一下设计模式当中非常重要的一个模式,工厂方法模式


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










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

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

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

//运算类
    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)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。

设计模式就是更好的去应用编程思想当中的原则。 希望此文章能都对您有帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: