简单工厂VS工厂方法
来源:互联网 发布:查询手机号数据库 编辑:程序博客网 时间:2024/06/11 23:23
1.简单工厂实现计算器
代码(简单工厂与工厂方法公共代码)
//Operaation运算类 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; } }简单工厂类
public class OperationFactory//工厂类 { public static Operation createOperate(string operate) { Operation oper = null; switch (operate) { case "+": oper = new OperationAdd (); break; case "-": oper = new OperationSub (); break ; case"*": oper = new OperationMul (); break; case "/": oper = new OperationDiv (); break ; } return oper ; } }
客户端代码:
Operation oper; oper = OperationFactory.createOperate("+"); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult(); Console.WriteLine("结果是" + result);
用以上的代码程序就可以直接运行出结果3,但是我觉得这不能实现计算机的功能,要计算应该让用户自己输入数字和符号,于是我把客户端的代码,改为了如下代码
try { Operation oper; Console.Write("请选择运算符号(+、-、*、/):"); oper = OperationFactory.createOperate(Console.ReadLine()); Console.Write("请输入数字A:"); oper.NumberA = Convert.ToDouble(Console.ReadLine()); Console.Write("请输入数字B:"); oper.NumberB = Convert.ToDouble(Console.ReadLine()); double result = oper.GetResult(); Console.WriteLine("结果是:" + result); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine("您输入有错:" + ex.Message); }
运行结果如下
简单工厂的优点:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
就像上面的计算器的例子,将要运算的数字和运算符号分离开,客户端不用写出使用某种符号的具体方法,而只要选择“+、-、*、/”中的一种符号给工厂,工厂自己就给出相应的实例,选择好运算符。
简单工厂的缺点:如果再添加一种运算方法就要对简单工厂类进行修改,也就是再添加新的case;修改原有的类,违背了开放封闭原则。
2.工厂方法模式实现计算器
//先构建一个工厂接口 interface IFactory { Operation createOperation(); } class AddFactoy : IFactory//加法类工厂 { public Operation CreateOperation() { return new OperationAdd(); } }
减、乘、除类类似就不再一一写出,客户端代码如下
IFactory operFactory=new AddFactoy (); Operation oper = operFactory.createOperation(); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult(); Console.WriteLine("结果是" + result);
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
就像上面的例子先定义一个创建运算符接口,然后再分别实现。
与简单工厂对比:解决了简单工厂与分支耦合的问题,根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类的工厂就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体乘除对象的工厂,于是我们要增加运算方法时,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了。
0 0
- 简单工厂VS工厂方法
- 简单工厂VS工厂方法
- 简单工厂 VS 工厂方法
- 简单工厂VS工厂方法
- 简单工厂 vs 工厂方法
- 简单工厂VS工厂方法
- 简单工厂 VS 工厂方法 VS 抽象工厂
- 简单工厂VS工厂方法VS抽象工厂
- 简单工厂VS工厂方法VS抽象工厂
- 简单工厂模式 VS 工厂方法模式
- 简单工厂模式vs工厂方法模式
- 工厂方法模式VS简单工厂
- 简单工厂模式 VS 工厂方法模式
- 简单工厂模式VS工厂方法模式
- 简单工厂模式VS工厂方法模式
- 【设计模式】简单工厂VS工厂方法
- 【设计模式】简单工厂VS工厂方法
- 工厂方法模式VS简单工厂模式
- [LeetCode OJ]Find Minimum in Rotated Sorted Array
- 第十八周OJ之找出素数
- c++基础知识,有现成的函数不用,非的自己设计算法,这不是坑爹吗?
- hdu1505 City Game (单调栈)
- 参与感读书笔记
- 简单工厂VS工厂方法
- 主成分分析-简单人脸识别(二)
- KNN(K近邻算法)
- scala 简要:再拾Scala
- 闲来无事,随便写写
- 新开网店怎么吸引顾客(小R台湾正品代购http://url.cn/ZuIiGx)
- JavaScript权威指南_05_第3章_类型/值/变量_3.2-文本
- javascript之正则表达式
- [QA]测试用例设计