一:软件设计的目标:是实现软件可维护,可扩展,可复用,灵活性好等功能。课本上通过活字印刷术讲述了面向对象编程的好处
二:例子:输入两个数和运算符来计算结果
将控制台输入和运算符运算分开实现即将业务层和界面逻辑分开,降低他们之间的耦合性。封装所有可能变化的部分。
Operation运算类
public class Operation
{
public static double GetResult(double,numberA,double numberB,string operate)
double result = 0d
switch(operate)
{
case "+":
resule = numberA+numberB;
break;
case "-":
resule = numberA-numberB;
break;
case "*":
resule = numberA*numberB;
break;
case "/":
resule = numberA/numberB;
break;
}
return result;
}
客户端代码
static void Main(string() args)
{
try
{
console.Write("请输入数字A:");
string strNumberA=Console.ReadLine();
console.Write("请选择运算符(+ - * /):");
string strOperate=Console.ReadLine();
console.Write("请输入数字B:");
string strNumberB=Console.ReadLine();
string strResult = ""
strResult =Convert.Tostring(Operation.GetResult
(Convert.ToDouble(strNumberA,Convert.ToDouble(strNumberB),strOperate));)
Console.WriteLine("结果是:"+strResult);
Console.ReadLine();
}
catch(Excepation ex)
{
Console.WriteLine("你的输入有错:"+ex.Message);
}
}上述的代码实现了对运算类的封装,但是如过添加一个开根号(sqrt)运算,在operation类中的switch中加一个分支,但是其他的四个运算没必要修改但代码却参与了编译,在修改的时候容易让没有问题的代码出错,暴露了其他重要代码。
如何提高代码的灵活性便于实现代码的修改和扩张?方法使用面向对象的继承和多态,运算符子类继承运算类,子类重写父类的运算方法,通过工厂来实例化运算子类,下面说下简单工厂模型。
三:简单工厂模型
1定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。
2内容:
工厂角色(Creator)
是简单工厂模式的核心,它负责实现创建所有具体产品类的实例。工厂类可以被外界直接调用,创建所需的产品对象。
抽象产品角色(Product)
是所有具体产品角色的父类,它负责描述所有实例所共有的公共接口。
具体产品角色(Concrete Product)
继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标。工厂类返回的都是该角色的某一具体产品。
3uml图

例子重构后的代码如下:<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+IDQuKDEp1MvL48DgPC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;">Public class Operation { private double _numberA =0; private double _numberB =0; public double NumberA { get { return _numberA;} set( _numerA = value;) } public double NumberB { get { return _numberB;} set( _numerB = value;) } public victual double GerResult() { double result = 0; return result; } }
4.(2)子类继承运算类
Class OperationAdd :Operation
{
public override double GetResult()
{
double result = 0 ;
result = _numberA + numberB;
return result;
}
}
Class OperationSub:Operation
{
double result = 0;
result = numberA - numberB;
return result;
}
Class OperationMul : Operation
{
double result = 0;
result = numberA * numberB;
return result;
}
Class OperationDiv:Operation
{
double result = 0;
result = numberA /numberB;
return result;
}
封装的例子中通过输入的两个数字和运算符号可以调用Operation.GetResult方法得要相应预算符的相应运算方法,但是各个运算类有各自的运算方法,但是如何通过输入+-..运算符来得到相应的运算方法。
4.(3)工厂实例化运算符子类
Public class OperationFactory
{
public static Operation createOperation(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
}
}控制台只要输入相应的运算符就会实例化对应的对象,通过多态返回父类的方式实现计算器的结果。
4.(4)控制台
Operation oper;
Oper = OperationFactory.createOperation("+");
Oper.NumberA=1;
Oper.numberB=2;
Double result = oper.GerResult();
最后的代码如果要修改+运算类的内容只需要修改OperationAdd类就可以,如果要添加其他的运算类,只需要增加一个运算类
并在switch中增加相应的实例化对象。
四.总结:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界与具体类隔离开来,偶合性低。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。