设计模式学习之简单工厂

  最近学习设计模式,这里学到简单工厂模式,现把一个简单计算器的代码写下来!

 第一步,做一个页面,这里只是做一个最简单的页面,重点学习设计模式,所以页面就很简单啦,在这个简单计算器里面,我还加上了Jquery.ajax,把简单工厂和ajax一起学了!

 我们先写好一个运算类,这个类有两个属性,可以当做变量来看,这两个属性就是,就是我要计算的两个运算数,然后再写一个运算方法,这个方法是virtual的,一个虚方法,只返回一个double类型的值,因为我过会要在子类中重写这个方法,这个运算类其实不会做什么,我所做的,都会在子类中去计算:

运算类如下:

 1  /// <summary>
 2     /// 运算类
 3     /// </summary>
 4    public  class Operation
 5     {
 6         private double numbera;//第一个运算数
 7 
 8         public double Numbera 
 9         {
10             get { return numbera; }
11             set { numbera = value; }
12         }
13         private double Numberb;//第二个运算数
14 
15         public double Numberb1 
16         {
17             get { return Numberb; }
18             set { Numberb = value; }
19         }
20         public virtual double GetResult() //运算方法,空,在子类中会重写这个方法
21         {
22             double  result = 0;
23             return result;
24         }
25 
26     }

 写好的运算类后,我们现在开始写加,减,成,除,这4个子类了,这几个类中我们去做各种计算,每个类都继承Operation运算类,这样每个类就都是两个运算数和一个运算方法了
第一个加法类如下:

/// <summary>
    /// 加法运算类
    /// </summary>
    class jiafayunsan:Operation 
    {
        public override double GetResult() //重写父类中的运算方法
        {
            double result = 0;
            result = base.Numbera + base.Numberb1; //用父类中的这个参数相加
            return result;
        }
    }

第二个减法类如下:

/// <summary>
    /// 减法类
    /// </summary>
    class Operationsub:Operation 
    {
        public override double GetResult()//重写父类中的运算方法
        {
            double result = 0;
            result = base.Numbera - base.Numberb1;//用父类中的这个参数相减
            return result;
        }
    }

第三个成法类如下:

/// <summary>
    /// 成法类
    /// </summary>
    class OperationMul:Operation 
    {
        public override double GetResult()//重写父类中的运算方法
        {
            double retult = 0;
            retult = base.Numbera * base.Numberb1;//用父类中的这个参数相成
            return retult;
        }
    }

第4个除法类如下:

/// <summary>
    /// 除法类
    /// </summary>
    class OperationDiv:Operation 
    {
        public override double GetResult()//重写父类中的运算方法
        {
            double result = 0;
            if (base.Numbera > 0)
            {
                result = base.Numbera / Numberb1;//用父类中的这个参数相除
            }
            return result;
        }
    }

现在这4个类都建好了,他们都继承自Operation运算类,但是现在怎么去用呢?那最重要的事情就要开始了,我们然后就要建一个简单工厂运算类,在这个类中我们去实列化过程,这就是工厂:
其实在这个工厂类里面,就是我们整个程序最容易变的地方,以后要是还要加更多的,我只要再加一个子类,在这个工厂类里面再一个判断,就行了,这样保证了,不论怎么变,我都不用去改计算的代码了!

工厂类如下:

 1  /// <summary>
 2     /// 工厂运算类
 3     /// </summary>
 4    public  class JianDanGongchang
 5     {
 6        public static Operation createoperate(string operate)
 7        {
 8            Operation oper = null;
 9 
10            switch (operate)
11            { 
12                case "+":
13                    oper = new jiafayunsan();//如果是“+”就调用加法类;
14                    break;
15                case "-":
16                    oper = new Operationsub();//如果是“-”就调用减法类;
17                    break;
18                case "*":
19                    oper = new OperationMul();//如果是“*”就调用成法类;
20                    break;
21                case "/":
22                    oper = new OperationDiv();//如果是“/”就调用除法类;
23                    break;
24            }
25            return oper;  
26        }
27     }

后台类写完了,然后我们就开始在前台调了,现在写好页面,新建一个aspx的页面,用JQUERY.POST异步的方式完成计算器,如下

<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function () {

            $("#buttons").click(function () {

                var number1 = document.getElementById("number1").value;//第一个运算数
                var number2 = document.getElementById("number2").value;//第二个运算数
                var yunsanfu = document.getElementById("Select1").value;//运算符

                //用Jquery.post方法提交
                $.post("Handler1.ashx", { numbera: number1, numberb: number2, yunsanfus: yunsanfu }, function (date) {
                    document.getElementById("count").value = date;


                })
            })

        })
    </script>
</head>
<body>
   <form id="form1" runat="server">
    <div>
        <input id="number1" type="text" name="name" value="" />
        <select id="Select1">
            <option value="+">+</option>
             <option value="-">-</option>
              <option value="*">*</option>
               <option value="/">/</option>
        </select>
        <input id="number2" type="text" name="name" value="" />
        <input id="buttons" type="button" vale="=" />
        <input id="count" type="text" name="name"  />
    </div>
   </form>
</body>
</html>

 页面写好了,JS的方法也写好了,然后再建一个ashx页面,在里面来调用简单运算工厂类,完成各种计算,代码如下:

 1  public class Handler1 : IHttpHandler
 2     {
 3 
 4         public void ProcessRequest(HttpContext context)
 5         {
 6             context.Response.ContentType = "text/plain";
 7 
 8             
 9             string numbera = context.Request.Form["numbera"];//第一个数字
10 
11             string numberb = context.Request.Form["numberb"];//第二个数字
12             string numberc = context.Request.Form["yunsanfus"]; //运算符
13 
14             Operation oper;
15             oper = JianDanGongchang.createoperate(numberc);//调用简单运算工厂类,传一个运算符,工厂类会帮你自己计算:
16 
17             oper.Numbera = Convert .ToDouble(numbera); //把一个参数传进来
18             oper.Numberb1 = Convert .ToDouble(numberb);//把第二个参数传进来
19 
20             double result = oper.GetResult(); //调用运算方法
21 
22             context.Response.Write(result); //返回运算回来的结果,回传给WebForm1.aspx页面。
23         }
24         
25         public bool IsReusable
26         {
27             get
28             {
29                 return false;
30             }
31         }
32     }

就这样,一个Jquery ajax加简单工厂的计算器就做完了,这里最重要的是学习简单工厂的设计模式!

原文地址:https://www.cnblogs.com/xu3593/p/2826314.html