简单工厂模式

简单工厂模式只是解决对象的创建问题

完成计算器:

仅利用面向对象的封装特性,完成计算器。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Calculate
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("请输入数字A:");
            string strNumberA = Console.ReadLine();
            Console.Write("请选择运算符号(+,-,*,/):");
            string strOperate = Console.ReadLine();
            Console.WriteLine("请输入数字B:");
            string strNumberB = Console.ReadLine();
            string strResult = "";
            strResult = Convert.ToString(Operation.GerResult(Convert.ToDouble(strNumberA),Convert.ToDouble(strNumberB),strOperate));
            Console.WriteLine("结果是:"+strResult);
            Console.ReadLine();
        }
    }
}
控制台代码

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Calculate
{
   public class Operation
    {
       public static double GerResult(double numberA,double numberB,string operate) {
           double result = 0d;
           switch (operate)
           {
               case "+":
                   result = numberA + numberB;
                   break;
               case "-":
                   result = numberA - numberB;
                   break;
               case "*":
                   result = numberA * numberB;
                   break;
               case "/":
                   result = numberA / numberB;
                   break;
               default:
                   break;
           }
           return result;
       }
    }


}
Operation

 

使用封装、继承和多态 + 简单工厂模式 来完成计算器。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Calculate
{
    class Program
    {
        static void Main(string[] args)
        {
            Operation oper;
            oper = OperationFactory.CreateOperate("+");
            oper.NumberA = 1;
            oper.NumberB = 2;
            double result = oper.GetResult();
        }
    }
}
主程序

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Calculate
{
    public class Operation
    {
        private double numberA = 0;

        public double NumberA
        {
            get { return numberA; }
            set { numberA = value; }
        }
        private double numberB = 0;

        public double NumberB
        {
            get { return numberB; }
            set { numberB = value; }
        }
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }

    }

}
Operation(实体类)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Calculate
{
    public class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }
}
OperationAdd(加法子类,重写父类operation类中的虚方法)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Calculate
{
    class OperationSub:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }
}
OperationSub(减法子类,重写父类Operation中的虚方法)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Calculate
{
    class OperationMul:Operation
    {
        public override double GetResult() {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }
}
OperationMul(乘法子类,重写父类Operation中的虚方法)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Calculate
{
    class OperationDiv : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            if (NumberB == 0)
                throw new Exception("除数不能为0");
            result = NumberA / NumberB;
            return result;
        }
    }
}
OperationDiv(除法子类,重写父类operation虚方法)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Calculate
{
    class OperationFactory
    {
        public static Operation CreateOperate(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;
                default:
                    break;
            }
            return oper;
        }
    }
}
OperationFactory(工厂类,根据用户实际需要创建加、减、乘、除中的方法)

 

在最后一个类operationFactory中,存在大量的switch语句。倘若今后需要增加计算方法,那么就需要为switch分支语句增加代码,使得程序还是不够灵活。

推荐做法是使用 配置文件+反射 来解决对象创建的问题。

在原本的主程序中创建对象的语句是需要传入一个字符串,用于工厂类中创建对象。

Operation oper = OperationFactory.CreateOperate("+");

这还不够灵活!(比如最常碰到的问题:程序后台数据库sqlServer要替换成oracle)

当需要生成什么对象,可以通过修改config文件来搞定,那么就极大的增加了程序的灵活性。

 

<add key="className" value="DbHelper的类名"/>//DBHelper的类名=程序集名字+"."+类名。
<add key="assemblyName" value="DbHelper所在的程序集的名字"/>
string className=ConfigurationManager.AppSettings["className"];
static  readonly string AssemblyName=ConfigurationManager.AppSettings["assemblyName"];

IDbHelper DB=Assembly.Load(AssemblyName).CreateInstance(className);
这个时候,DB.Query("strSql");就有用了

 

 

 

posted @ 2018-01-29 22:11  水墨晨诗  阅读(174)  评论(0编辑  收藏  举报