导航

学完模式判若两人——简单工厂模式

Posted on 2010-04-16 11:07  敬云  阅读(426)  评论(0)    收藏  举报

对于面向对象编程,最重要的是容易维护,容易扩展。

很多初学者在遇到问题时习惯性的用计算机能够理解的逻辑去描述和表达问题,比如实现一个简单的运算,1+1=?

 

代码
Console.Write("输入数字a:"); 
double a =Convert.ToDouble(Console.ReadLine()) ;
Console.Write(
"输入数字b:");  
double b =Convert.ToDouble(Console.ReadLine()) ;
Console.Write(
"结果是:");
Console.Write(Convert.ToString(a
+b));

 

 

但是当要求他换成乘法、除法,甚至多种运算时就会更改很多地方。

用面向对象的方法就会好很多

因为面向对象的分析设计编程思想是通过封装、继承、多态把程序的耦合度降低,使得程序更加灵活,容易修改,并且易于复用。 

怎么操作呢,简单来说,就是业务的封装,下面用简单的工厂模式演示一下。


首先建立个运算类(父类)

 

代码
public class OperationBase
{
    
private double numberA;
    
private double numberB;
    
public double NumberA
    {
        
getreturn this.numberA;}
        
set{this.numberA=value;}
    } 
        
public double NumberB
    {
        
getreturn this.numberB;}
        
set{this.numberB=value;}
    }  
     
public virtual double GetResult();

 

 


子类,各种运算类

 

代码
class OperationAdd : Operation
{
    
public override double GetResult()
    {
        
double result = 0
        result 
= NumberA + NumberB;
        
return result; 
    } 
}  
class OperationDiv : Operation
{
    
public overide double GetResult()
    {
        
double result = 0;
        
if(NumberB==0)
            
throw new ArgumentOutOfRangeException(); //参数错误
        result = NumberA / NumberB;
        
return result; 
    } 

 

 

..........各种需要的运算操作类,如果需要添加进去就可以

下面就是比较重要的工厂类

 

代码
public class Factory
{
    
public static Operation createOperation(string operation) 
    {
        Operation oper;
        
switch(operation)
        {
             
case "+":
                oper 
= new OperationAdd();break;
              
case "-":
                oper 
= new OperationAdd();break;
             
case "*":
                oper 
= new OperationAdd();break;
             
case "/":
                oper 
= new OperationAdd();break
             ....... 
        } 
        
return oper; 
    } 

 

 

 

工厂类的作用在于 为Operation选取需要的操作类进行应用

具体事例应用

 

 

Operation oper; 
oper 
= Factory.createOperation("+"); //或者操作符可由其他方式获得,例如输入的 
oper.NumberA = 1;
oper.NumberB 
= 2;
double result = oper.GetResult();

 

 

 

这里 我们完全可以活用,比如做一个WinForm的计算器,操作符或者操作数都是由人工输入

通过GetResult()获得最后的结果

当遇到需求的更改时,比如增添一个平方运算,开方运算,只需要增添相应的子类,然后在工厂类中作出相应的判断即可,这样可以充分的体现面向对象工厂模式的优点