首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

狂言设计模式之一简单工厂模式

2013-02-24 
大话设计模式之一简单工厂模式这是我所敲的第一个设计模式,一个严来说不能算作设计模式的模式,一个让我这

大话设计模式之一简单工厂模式

    这是我所敲的第一个设计模式,一个严格来说不能算作设计模式的模式,一个让我这个菜鸟头疼了两天的模式~对于刚才VB6.0转战过来的、从前认为代码简单即是优的我来说,理解这个过程真的很痛苦呢~

    在这里也受到了面向对象的第一次洗礼,所有的代码都不能只顾着眼前,单纯的只为了设计出某些功能就算完事了,而需统筹兼顾,站在更高的层次如安全性、维护性、经济性上看问题。我们要尝试着去做一个设计者,而不是单纯的复制粘贴似的代码工人。

    这个例子是为了实现一个简单计算器的运算功能。在其演变当中,从封装到继承再到多态,无一不在体现着可维护、可复用(可不是复制哦)、可扩展、灵活性好的特点。首先来看一下简单工厂的UML图:

                狂言设计模式之一简单工厂模式

 

   

     再来看看代码:

    Operation运算类:定义简单工厂创造的对象父类,可以是一个类、或者一个接口。    

    //创建父类Operation    public class Operation    {        private double _numberA = 0;        private double _numberB = 0;        //NumberA属性        public  double NumberA        {            get { return _numberA; }            set { _numberA = value; }        }        //NumberB属性        public   double NumberB        {    get { return _numberB; }             set { _numberB = value; }        }        //构建运算虚方法        public virtual double GetResult()        {            double result = 0;            return result;        }    }


 

    加法、除法类:它们是工厂具体加工的对象
    //加法类,继承运算类(Operation)    class OperationAdd: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!");            else                 result = NumberA / NumberB;            return result;        }    }


    简单运算工厂类:simple factory的核心,含所有实例的内部逻辑,可被客户端等调用,用来创建产品所需的对象。 它可以是一个接口,也可以是一个抽象类

 
    public  class OperationFactory    {        //首先createOperate是一个静态方法(static),这意味着不用创建OperationFactory类的实例对象就能调用这个方法,OperationFactory.createOperate(operate);        //其次这个方法的返回值类型是Operation,方法包含一个String类型的参数,public决定了这个方法是一个公共方法        public static Operation createOperate(string operate)        {            Operation oper = null;            switch (operate)            {                //实例化加法类                case "+":                    oper = new OperationAdd();                    break;                    break;                //实例化除法类                case "/":                    oper = new OperationDiv();                    break;            }            return oper;        }    }


    客户端代码:只知道传入了工厂类的参数,对于如何创建对象(逻辑)不关心

            //举例加法运算             Operation oper;            oper = OperationFactory.createOperate("+");            oper.NumberA = 1;            oper.NumberB = 2;            double resultAdd = oper.GetResult();            //显示运算结果            Console.WriteLine("加法运算的结果值为:{0}", resultAdd);            Console.ReadLine();            //除法            oper = OperationFactory.createOperate("/");            oper.NumberA = 1;            oper.NumberB =5;            double resultSub = oper.GetResult();            Console.WriteLine("除法运算的结果值为:{0}",resultSub );            Console.ReadLine();

 

    这样写完之后,各个运算类之间是独立的,耦合性大大降低。如果想要增加一个乘法运算,只要编写一个乘法类,在简单工厂模式(代码安全,没有运算过程)中增加一条case语句就行了。下面是执行结果:
                                                                                                狂言设计模式之一简单工厂模式

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

    缺点:由于简单工厂模式本身包括了所有的运算方式,每次维护或者扩展计算方法都要改动这个工厂,以致代码重新编译部署,解决方法在后续的学习当中会出现。

 

 

 

   
4楼liutengteng130昨天 16:18
加油。
Re: wlccomeon昨天 08:07
回复liutengteng130n嗯嗯~
3楼beijiguangyong前天 13:50
学习了~
Re: wlccomeon前天 13:50
回复beijiguangyongn呃。。。勇哥,光临寒舍真是让我蓬荜生辉啊!
2楼xvshu3天前 21:27
学习啊
Re: wlccomeon前天 13:49
回复xvshun共同学习~
1楼wss7846161584天前 19:28
字体在大一点吧!感觉比较费劲!
Re: wlccomeon4天前 08:08
回复wss784616158n嗯,下次注意~

热点排行