设计模式记录2之"简单工厂模式"

下了本《大话设计模式》电子版在学习,据说也是cnblogs出身的,打算好好学习一下设计模式。今天上班趁着空闲阅读了"简单工厂模式"和"策略模式"。

 先记录一下"简单工厂模式"吧。

简单工厂模式的实质就是由一个工厂类根据传入的参数,动态的决定应该创建那一个产品类的实例,这些产品都继承自一个父类或者接口。

以一个简单的计算器为例子,上代码。

首先创建一个父类,其实也可以创建一个接口。

 1    ///   <summary>
 2       ///  简单工厂模式
 3       ///  计算类
 4       ///  成员:两个数,虚方法
 5       ///   </summary>
 6       public   class  Operation
 7      {
 8           private   double  numberOne;
 9 
10           public   double  NumberOne
11          {
12               get  {  return  numberOne; }
13               set  { numberOne  =  value; }
14          }
15           private   double  numberTwo;
16 
17           public   double  NumberTwo
18          {
19               get  {  return  numberTwo; }
20               set  { numberTwo  =  value; }
21          }
22          // 虚方法,子类重写父类的这个方法
23           public   virtual   double  GetOperation()
24          { 
25               double  result = 0 ;
26               return  result;
27          }
28      }

 然后创建计算子类,继承自这个父类。为方便,我在这里只建立两个计算类,加法和减法。其实这里可以根据需求来创建的,可以增加除法计算和乘法算法:

 1  ///   <summary>
 2       ///  加法计算类,继承自计算类Operation
 3       ///   </summary>
 4       ///   <returns></returns>
 5       public    class  AddOperation:Operation
 6      {
 7           // 重写父类中的计算方法
 8           public   override   double  GetOperation()
 9          {
10               // 继承了父类,可以直接调用两个成员
11               double  result  =  NumberOne  +  NumberTwo;
12               return  result;
13          }
14      }
15 
16 
17  ///   <summary>
18       ///  减法类,继承自计算类
19       ///  重写父类的虚方法
20       ///   </summary>
21       ///   <returns></returns>
22       public   class  SubOperation:Operation
23      {
24          
25           public   override   double  GetOperation()
26          {
27               double  result  =   0 ;
28              result  =  NumberOne  -  NumberTwo;
29               return   base .GetOperation();
30          }
31      }

 接着,创建工厂。在这个工厂中决定实例化哪一个类。

 1  ///   <summary>
 2       ///  工厂类
 3       ///  根据参数决定实例哪一个类
 4       ///   </summary>
 5       public   class  Factory
 6      {
 7        // 静态的工厂方法
 8         public   static  Operation createOperation( string  operation)
 9         {
10              // 定义父类,为空
11              Operation oper  =   null ;
12               switch  (operation)
13              { 
14                    // 根据参数决定实例化哪一个计算子类
15                   case   " + " :
16                      oper  =   new  AddOperation();
17                       break ;
18                   case   " - " :
19                      oper  =   new  SubOperation();
20                       break ;
21              }
22               return  oper;
23          }
24      }

 至此,简单工厂就已经写完了,在客户端我们可以这样用:

1  // 简单工厂客户端方法
2           public   double  Client( double  num1,  double  num2,  string  oper)
3          {
4              Operation operation  =  Factory.createOperation(oper);
5              operation.NumberOne  =  num1;
6              operation.NumberTwo  =  num2;
7               return  operation.GetOperation();
8          }

 至此,如果我们要有乘法或者除法或者其他更多的运算,只需要继续增加子类继承Operation,然后在工厂类中的switch语句中增加分支就可以了。

 

你可能感兴趣的:(简单工厂模式)