首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

每天一个设计模式(简单工厂模式 -2011.4.17 星期日)期待提问和讨论解决方法

2012-02-24 
每天一个设计模式(简单工厂模式 -2011.4.17 星期日)期待提问和讨论简单工厂模式示例代码计算器C# codename

每天一个设计模式(简单工厂模式 -2011.4.17 星期日)期待提问和讨论
简单工厂模式示例代码

计算器

C# code
namespace 简单工厂{    public class Operation    {        private double _leftNum;        public double LeftNum        {            get { return _leftNum; }            set { _leftNum = value; }        }        private double _rightNum;        public double RightNum        {            get { return _rightNum; }            set { _rightNum = value; }        }        public virtual double GetResule()        {            return 0.0;        }    }    public class OperationAdd : Operation    {        public override double GetResule()        {            double result = 0;            result = LeftNum + RightNum;            return result;        }    }    public class OperationSub : Operation    {        public override double GetResule()        {            double result = 0;            result = LeftNum + RightNum;            return result;        }    }    public class OperationMul : Operation    {        public override double GetResule()        {            double result = 0;            result = LeftNum * RightNum;            return result;        }    }    public class OperationDiv : Operation    {        public override double GetResule()        {            double result = 0;            if (LeftNum == 0)            {                throw new Exception("除数不能为 0。");            }            result = LeftNum / RightNum;            return result;        }    }    public class OperationSqr : Operation    {        public override double  GetResule()        {            double result = 0;            result = LeftNum * LeftNum;            return result;        }    }    public class OperationSqrt : Operation    {        public override double GetResule()        {            double result = 0;            if (LeftNum == 0)            {                throw new Exception("负数不能开平方根。");            }            result = Math.Sqrt(LeftNum);            return result;        }    }    public class OperationReverse : Operation    {        public override double GetResule()        {            double result = 0;            result = -LeftNum;            return result;        }    }    public class OperationFactory    {        public static Operation createOperate(string operate)        {            Operation op = null;            switch (operate)            {                case "+":                    {                        op = new OperationAdd();                        break;                    }                case "-":                    {                        op = new OperationSub();                        break;                    }                case "*":                    {                        op = new OperationMul();                        break;                    }                case "/":                    {                        op = new OperationDiv();                        break;                    }                case "sqr":                    {                        op = new OperationSqr();                        break;                    }                case "sqrt":                    {                        op = new OperationSqrt();                        break;                    }                case "+/-":                    {                        op = new OperationReverse();                        break;                    }            }            return op;        }    }}


以下是代码简单说明

代码用简单工厂模式实现了计算器的功能

子类如 OperationAdd 重写父类的 GetResult 方法实现具体的运算方法

最后经由 OperationFactory 类中的静态方法 CreateOperation 根据传入的参数 实例化对应的运算类


------解决方案--------------------


只有代码?
[解决办法]

[解决办法]

[解决办法]
楼主真勤快
[解决办法]
我觉得lz不去领会设计模式的精要,去做这种脱裤子放屁多此一举的案例,很无聊。

事实上研究23种设计模式的实现一点意义都没有,上面没有一条你能用得到,你如果想在开发的时候照搬,死得很透。

有这个时间不如去看看人家怎么组织一个框架的,别的不说,ASP.NET MVC 就是一个学习范例。
[解决办法]
其实简单工厂就是以子类替换父类的方式,根据条件,实例化合适的对象
[解决办法]
哈哈,设计模式有用啊,
虽然我没学过设计模式,
但我写的代码,说不定不知不觉就已经实现了某种设计模式,
设计模式在于解决问题,优化编码,方便扩展。
[解决办法]

探讨
引用:
我觉得lz不去领会设计模式的精要,去做这种脱裤子放屁多此一举的案例,很无聊。

事实上研究23种设计模式的实现一点意义都没有,上面没有一条你能用得到,你如果想在开发的时候照搬,死得很透。

有这个时间不如去看看人家怎么组织一个框架的,别的不说,ASP.NET MVC 就是一个学习范例。


不过是以简单的例子来表示一个模式而已,这里的重点是模式……

[解决办法]
10楼,多数据库支持没那么简单的,呵呵。
除非你有一个非常成熟的框架,封装了所有数据库操作细节,
一个大型系统用SqlServer,你想把它移植到Access,肯定是很困难的。

关是数据库的移植就够戗。
[解决办法]
11楼,有人是先学设计模式,再用设计模式指导编程,
也有人先写代码,写出优秀的代码,再用设计模式来规范。

各有各的优缺点。
当自己想破脑袋想出一种优雅的编码方式,哪一天翻开 某本书,才发现人家早就想出来了,
而且比自己做的还好得多,那时想自杀的心情都有。
[解决办法]
我是冲每天一个设计模式这个标题忍不住说两句的。

因为很多很多人都觉得设计模式就是GoF的23种(或者可能现在某些书又多了几种,我不知道)。总之一个月搞定。

然后觉得套用这些模式了,代码就上档次了。就lz给出的这个四则运算的代码,就非常烂。简单工厂能搞出这个架势,就事论事说,就是lz没有学会什么叫简单工厂。lz不要不服气。

我来给lz举一个简单工厂真的让程序简单的例子:
比如说你写一个排序的程序,那么你提供从文本文件、控制台和一个随机数发生器获取数据的方法(DataProvider),这个案例下,你使用简单工厂,那么就很好。
另外在C++里面,你用switch...case来写,C#里面你还这么套用就是没事找事。
C#提供了反射(RTTI/RTTC),你的分支可以被缩减到5行。进一步的,你可以使用C# 3提供的表达式树,或者C# 4的动态类。这才是最佳实践。

lz这个例子应该这么考虑,它用什么模式实现比较好,而不是说今天我学工厂,那么不管一切,这个就是用工厂实现。lz一定要给这个代码一个模式,我觉得strategy模式会稍微好一些。

当然,什么模式不用才是最好!我觉得一个普适的哲学就是,简单比复杂好。
[解决办法]
44楼,反射我还是不怎么喜欢用,

Windows底层的事件处理,就套了 n 多个 case ,
好坏没有统一的标准。
[解决办法]
反射的结果,导致我辛苦写的代码,很容易就被反编译了,
还是用VC++好。
[解决办法]
探讨
我觉得lz不去领会设计模式的精要,去做这种脱裤子放屁多此一举的案例,很无聊。

事实上研究23种设计模式的实现一点意义都没有,上面没有一条你能用得到,你如果想在开发的时候照搬,死得很透。

有这个时间不如去看看人家怎么组织一个框架的,别的不说,ASP.NET MVC 就是一个学习范例。

[解决办法]
直接编码容易产生对 设计模式的误解,
就象小孩子看简单的建筑设计图,认为很简单一样,认为自己也能画。
[解决办法]
只有学完各种基础学科,比如数学、八大力学、结合各种实际情况,
才能画出真正的设计图。

设计模式就是这样。
[解决办法]
用户请求一个产品,工厂创建不同的子类产品,作为父类返回给用户。这就是简单工厂(SimpleFactory)的通俗理解。
[解决办法]
探讨
引用:

我是冲每天一个设计模式这个标题忍不住说两句的。

因为很多很多人都觉得设计模式就是GoF的23种(或者可能现在某些书又多了几种,我不知道)。总之一个月搞定。

然后觉得套用这些模式了,代码就上档次了。就lz给出的这个四则运算的代码,就非常烂。简单工厂能搞出这个架势,就事论事说,就是lz没有学会什么叫简单工厂。lz不要不服气。

我来给lz举……

------解决方案--------------------


希望不要老是抄书上的例子,把设计模式应用到自己的项目中,能极大优化项目的管理,优化代码,
才是真正的学透设计模式。否则都是纸上谈兵,有害无益。
[解决办法]
我要学SAP的设计方式,
不知道 SAP 是采用哪一种设计模式,^_^.

热点排行