一、简单工厂(创建型模式)(不是GOF二十三种设计模式之一):由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(产品类继承于父类或者接口)的实例。
二、类图:
三、代码
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;
}
}
//Operation Factory
public static Operation createOperate(string operate)
{
Operation operation = null;
switch (operate)
{
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
}
return operation;
}
//Main
/// <summary>
/// 计算器的代码,实现方法的封装,继承
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 10;
oper.NumberB = 5;
double result = oper.GetResult();
Console.WriteLine(result);
Console.ReadLine();
}
四、优缺点
优点:
不需要关心如何创建具体的产品,只需要提供产品的名称作为参数传给工厂,就可以实现想要的产品功能,构造容易,逻辑简单
缺点:
-
调用方法传递参数时,需要switch判断具体实现哪个方法
-
一个工厂类集合了所有类的实例创建逻辑,违反了高内聚的责任分配原则
引用:http://www.cnblogs.com/ytaozhao/p/3387540.html
<<大话设计模式>>(程杰)