每天一个设计模式(简单工厂模式 -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 就是一个学习范例。
[解决办法]
其实简单工厂就是以子类替换父类的方式,根据条件,实例化合适的对象
[解决办法]
哈哈,设计模式有用啊,
虽然我没学过设计模式,
但我写的代码,说不定不知不觉就已经实现了某种设计模式,
设计模式在于解决问题,优化编码,方便扩展。
[解决办法]
[解决办法]
10楼,多数据库支持没那么简单的,呵呵。
除非你有一个非常成熟的框架,封装了所有数据库操作细节,
一个大型系统用SqlServer,你想把它移植到Access,肯定是很困难的。
关是数据库的移植就够戗。
[解决办法]
11楼,有人是先学设计模式,再用设计模式指导编程,
也有人先写代码,写出优秀的代码,再用设计模式来规范。
各有各的优缺点。
当自己想破脑袋想出一种优雅的编码方式,哪一天翻开 某本书,才发现人家早就想出来了,
而且比自己做的还好得多,那时想自杀的心情都有。
[解决办法]
我是冲每天一个设计模式这个标题忍不住说两句的。
因为很多很多人都觉得设计模式就是GoF的23种(或者可能现在某些书又多了几种,我不知道)。总之一个月搞定。
然后觉得套用这些模式了,代码就上档次了。就lz给出的这个四则运算的代码,就非常烂。简单工厂能搞出这个架势,就事论事说,就是lz没有学会什么叫简单工厂。lz不要不服气。
我来给lz举一个简单工厂真的让程序简单的例子:
比如说你写一个排序的程序,那么你提供从文本文件、控制台和一个随机数发生器获取数据的方法—ataProvider),这个案例下,你使用简单工厂,那么就很好。
另外在C++里面,你用switch...case来写,C#里面你还这么套用就是没事找事。
C#提供了反射(RTTI/RTTC),你的分支可以被缩减到5行。进一步的,你可以使用C# 3提供的表达式树,或者C# 4的动态类。这才是最佳实践。
lz这个例子应该这么考虑,它用什么模式实现比较好,而不是说今天我学工厂,那么不管一切,这个就是用工厂实现。lz一定要给这个代码一个模式,我觉得strategy模式会稍微好一些。
当然,什么模式不用才是最好!我觉得一个普适的哲学就是,简单比复杂好。
[解决办法]
44楼,反射我还是不怎么喜欢用,
Windows底层的事件处理,就套了 n 多个 case ,
好坏没有统一的标准。
[解决办法]
反射的结果,导致我辛苦写的代码,很容易就被反编译了,
还是用VC++好。
[解决办法]
[解决办法]
直接编码容易产生对 设计模式的误解,
就象小孩子看简单的建筑设计图,认为很简单一样,认为自己也能画。
[解决办法]
只有学完各种基础学科,比如数学、八大力学、结合各种实际情况,
才能画出真正的设计图。
设计模式就是这样。
[解决办法]
用户请求一个产品,工厂创建不同的子类产品,作为父类返回给用户。这就是简单工厂(SimpleFactory)的通俗理解。
[解决办法]
------解决方案--------------------
希望不要老是抄书上的例子,把设计模式应用到自己的项目中,能极大优化项目的管理,优化代码,
才是真正的学透设计模式。否则都是纸上谈兵,有害无益。
[解决办法]
我要学SAP的设计方式,
不知道 SAP 是采用哪一种设计模式,^_^.