大话设计模式,让你的代码更完美4---简单工厂模式和工厂方法模式
来源:互联网 发布:修改php端口号 编辑:程序博客网 时间:2024/06/01 23:25
在之前的文章中简单的阐述了一下简单工厂模式。
在这里要说一个新的模式,与其类似但又不同,叫做工厂方法模式。
简单工厂模式(具体的代码翻看第一章,这里只说一下比较重要的部分):
结构图:
工厂类代码:
public class OperationContest { Operation open; public OperationContest(string operate) { switch (operate) { case "+": { open = new OperationAdd(); break; } case "-": { open = new OperationSub(); break; } case "*": { open = new OperationMul(); break; } case "/": { open = new OperationDiv(); break; } } } public double GetResult() { return open.GetResult(); } }
主函数代码:
Operation oper; oper = OperationFactory.createOperate(strOperate); oper.NumberA = Convert.ToDouble(strNumberA); oper.NumberB = Convert.ToDouble(strNumberB); strResult = oper.GetResult().ToString();
工厂方法模式:
结构图:
创建工厂接口代码:
interface IFactory { Operation CreateOperation(); }创建负责加减乘除的工厂代码:
/// <summary> /// 专门负责生产“+”的工厂 /// </summary> class AddFactory : IFactory { public Operation CreateOperation() { return new OperationAdd(); } } /// <summary> /// 专门负责生产“-”的工厂 /// </summary> class SubFactory : IFactory { public Operation CreateOperation() { return new OperationSub(); } }
创建加减
/// <summary> /// 加法类 /// </summary> class OperationAdd : Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } /// <summary> /// 减法类 /// </summary> class OperationSub : Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } }
运算类:
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; } } /// <summary> /// 得到运算结果 /// </summary> /// <returns></returns> public virtual double GetResult() { double result = 0; return result; } }
主函数:
IFactory operFactory = new AddFactory(); Operation oper = operFactory.CreateOperation(); oper.NumberA = 1; oper.NumberB = 2; double result=oper.GetResult();
代码流程:
声明一个工厂类接口,但实例化一个加法运算工厂类。(工厂类是加法工厂类的父类)
调用加法工厂对象,创建运算类,设置相关参数,通过GetResoult获取计算结果
对比发现:
简单工厂类的优点:包含了必备的逻辑处理(switch),根据客户端的条件动态去实例化相关类,对于客户端来说去除了与具体产品的依赖。
简单工厂类的缺点:如果要加一个乘法运算,必须要修改工厂类(switch里的case条件),这样相当于扩展开放了,修改也开放了,违反开放-封闭原则。
工厂方法模式的优点:含有简单工厂模式的优点,且新增功能时不用修改工厂类,扩展性好显而易见。
工厂方法模式的缺点:比简单工厂类的代码少许复杂.
具体实现如下,当需要添加乘法运算模块时,我们只需要添加2个类,一个是乘法的工厂类,一个是乘法的具体实现类。
乘法工厂类:
/// <summary> /// 专门负责生产“*”的工厂 /// </summary> class MulFactory : IFactory { public Operation CreateOperation() { return new OperationMul(); } }
乘法实现类:
/// <summary> /// 乘法类 /// </summary> class OperationMul : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } }主函数:
//IFactory operFactory = new AddFactory(); IFactory open = new MulFactory(); Operation oper = open.CreateOperation(); oper.NumberA = 1; oper.NumberB = 2; double result=oper.GetResult();
是否发现这种实现方式根本就不用修改任何的工厂类,只需要在调用的时候更改一下所要new出的对象就可以了,就能达到我们所期盼的结果。
这就是学习的过程,每天进步一点点,美滋滋!
0 0
- 大话设计模式,让你的代码更完美4---简单工厂模式和工厂方法模式
- 大话设计模式,让你的代码更完美1---工厂模式
- 大话设计模式,让你的代码更完美10---抽象工厂模式
- 大话设计模式,让你的代码更完美6---模版方法模式/迪米特
- 大话设计模式,让你的代码更完美5---浅复制和深复制
- 大话设计模式之简单工厂模式、抽象工厂模式及工厂方法模式的比较
- 大话设计模式之简单工厂模式、抽象工厂模式及工厂方法模式的比较
- 大话设计模式,让你的代码更完美2---嵌套装饰模式
- 大话设计模式,让你的代码更完美3---代理模式
- 大话设计模式,让你的代码更完美7---外观模式
- 大话设计模式,让你的代码更完美8---建造者模式
- 大话设计模式,让你的代码更完美9---旁观者模式
- 大话设计模式,让你的代码更完美11---状态模式
- 大话设计模式4 简单工厂模式VS工厂模式
- 大话设计模式之简单工厂模式&工厂方法模式&抽象工厂模式
- 大话设计模式 工厂方法
- 大话设计模式____简单工厂VS工厂方法
- 大话设计模式之简单工厂模式代码
- 解析请求头部来自哪个浏览器---浏览器User-Agent
- JAVA集合类汇总
- linux 大杂烩
- 1617
- Ubuntu16.04 静态IP配置
- 大话设计模式,让你的代码更完美4---简单工厂模式和工厂方法模式
- linux安装tomcate
- Hadoop namenode重新格式化需注意问题
- IOS Swift语言开发 tableView的重用以及自cell的自适应高度
- struts和hibernate配置
- javaweb图片上传
- js+canvas绘制QQ下拉刷新贝塞尔曲线效果
- ISO12233:2014 eSFR分辨率测试卡使用方法
- html meta标签大全