设计模式-简单工厂模式

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

今天学习一个简单的设计模式:简单工厂模式。用这个模式来实现一个简单的计算器。可以实现加减乘除4则运算。

一看这个问题,我们发现问题真的挺简单,基本上学过简单的程序设计的都可以完成。但是要写出一个低耦合、灵活、容易修改、可复用的程序也许就不是那么简单了。

编程是一门技术,更加是一门艺术,不能只满足于写完代码运行结果,时常考虑如何让代码更加简练,更加容易维护,更加扩展与复用,

首先,我们应该用尽可能的方法去避免重复。比如如果要求一个控制台的,要求修改为界面的,如何避免重复?答案是将计算与显示分开。

简单的说,就是让业务逻辑与界面逻辑分开,让它们之间的耦合度下降,只有分离开,才可以达到容易维护或拓展。

接下来,我们怎么样让程序更灵活呢?比如加上一个开根号的功能,我们应该把加减乘除等运算分离,修改其中一个不影响另外的集合,增加运算算法也不影响其他代码。

然后,我们如何让计算器知道我是希望用哪一个算法呢?

简单工厂模式:到底要实例化谁,将来会不会找你增加实例化的对象,比如开根对象,这些很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。

源代码:

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

namespace SimpleFactory
{
    //要求使用简单工厂模式,实现一个计算器程序

    //简单工厂类
    public class OperatorFactory
    {
        public static Operator createOperator(string operate)
        {
            Operator oper = null;

            switch (operate)
            {
                case "+":
                    oper = new OperatorAdd();
                    break;
                case "-":
                    oper = new OperatorSub();
                    break;
                case "*":
                    oper = new OperatorMul();
                    break;
                case "/":
                    oper = new OperatorDiv();
                    break;
            }

            return oper;
        }
    }
    //运算类
    public class Operator
    {
        private double numberA = 0;
        private double numberB = 0;

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

        public double NumberB
        {
            get { return numberB; }
            set { numberB = value; }
        }

        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

    public class OperatorAdd : Operator
    {
        public override double GetResult()
        {
            double result = NumberA + NumberB;
            return result;
        }
    }

    public class OperatorSub : Operator
    {
        public override double GetResult()
        {
            double result = NumberA - NumberB;
            return result;
        }
    }

    public class OperatorMul : Operator
    {
        public override double GetResult()
        {
            double result = NumberA * NumberB;
            return result;
        }
    }

    public class OperatorDiv : Operator 
    {
        public override double GetResult()
        {
            if (NumberB == 0)
                throw new Exception("除数不能为0");
            double result = NumberA / NumberB;
            return result;
        }
    }

    class Program
    {
        //界面
        static void Main(string[] args)
        {
            Operator oper;
            oper = OperatorFactory.createOperator("/");
            oper.NumberA = 1;
            oper.NumberB = 0;
            try
            {
                Console.WriteLine(oper.GetResult());
            }
            catch(Exception ex) 
            {
                Console.WriteLine(ex.Message);
            }
            
            Console.Read();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值