//工厂方法模式(创建型)
//与简单工厂模式的区别:
//简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化的类,对于客户端来说,
//去除了与具体产品的依赖。但是问题也在这里,就像为如果为简单工厂模式下的二元四则运算添加一个新的功能,如计算
// ”M的N次方“,这时候我们就需要在工厂类中增加一个case分支,这就违背了开闭原则。而工厂方法模式想要增加这个功能
//时,类都是在增加,没有修改,但客户端需要进行相应的修改。
//1、工厂方法模式下的二元四则运算
// 二元运算的基类
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)
{result = NumberA / NumberB;}else
{throw new Exception("can't divided by 0");}return result;
}}//工厂接口
interface IFactory
{Operation CreateOperation();}//加减乘除各创建一个具体工厂实现接口
class AddFactory : IFactory
{public Operation CreateOperation()
{return new OperationAdd();}}class SubFactory : IFactory
{public Operation CreateOperation()
{return new OperationSub();}}class MulFactory : IFactory
{public Operation CreateOperation()
{return new OperationMul();}}class DivFactory : IFactory
{public Operation CreateOperation()
{return new OperationDiv();}}public class test{public static void Main(){IFactory operFactory = new AddFactory(); // 这个位置可更改Operation oper = operFactory.CreateOperation();oper.NumberA = 1;oper.NumberB = 2;double result = oper.GetResult();
Console.WriteLine(result);Console.ReadLine();}}