黑马程序员:初识设计模式,简单工厂模式的计算器

----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

 

所谓设计模式,我个人理解为为了更好的解决问题,解决过程中所产生的一种思维的模版。世界上本没有路,走的人多了,就有了路,无数程序员踏出的这条解决问题的路,自然有其好处,根据这条路来思考,编程,清晰明了,并且继承了一系列好处,比如可维护性,比如可扩展性。

简单工厂模式

进入正题,想要设计一个计算器,要知道的无外乎2个,数、运算法则(即运算符)。运算法则,就是我们需要封装的了,包括已有的,自定义的。数则作为参数传递。对于用户输入的运算符,是不可预知的,我们不知道需要用哪个对象来进行计算。这里就需要用到工厂,判断客户端提交的oper来生产相应的运算法则对象。

1、为了实现多态,首先来一个实现计算的接口,屏蔽掉运算法则的差异

interface ICalculate 
{ object Calculate(); }

考虑到多态, 返回类型用了object

2、封装运算法则

//加法,二目运算符
class Add:ICalculate
{
        int num1, num2;
        public Add(int num1,int num2)
        {
            this.num1 = num1;
            this.num2 = num2;
        }
        public object Calculate()
        {
            return num1 + num2;
        }
}
//阶乘,一目运算符
class Factorial:ICalculate
{
        int num;
        public Factorial(int num)
        {
            if (num <= 0)
            {
                this.num=1;
            }
            this.num = num;
        }
        public object Calculate()
        { 
            return Multi(num);
        }
        int Multi(int num)
        {
            if (num <= 0)
            {
                return 1;
            }
            return num * Multi(num - 1);
        }
}

 

3、接下来开始工厂类的设计

class Factory
    {
        //生成二目运算符对象
         public static ICalculate Create(string oper,int num1,int num2)
        {
            switch (oper)
            {
                case "+": return new Add(num1, num2);
                case "-": return new DIf(num1, num2);
                default: return null;
            }
        }
        //生成一目运算符对象
         public static ICalculate Create(string oper, int num)
        {
            switch (oper)
            {
                case "!": return new Factorial(num);
                default: return null;
            }
        }
    }

 工厂类中2个方法相当于2条具体的生产线。

4、在客户端的调用

ICalculate c=Factory.Create(string oper,int num1,int num2);
if(c!=null)
{
        c.Calculate();//这就是我们想要的结果了
}

 

浅谈我理解的抽象工厂

如果考虑到工厂的可扩展性,可以继续对工厂进行处理。

工厂都有生产的能力,于是我们可以定义一个抽象工厂,所有的具体工厂类都实现抽象工厂中定义的那些公共接口。这样做职责清晰,可以减小每一个工厂的大小,并且利于扩展和维护,但是缺点也有,由于每条生产线只能生产一种产品,每加入一个产品就必须开一个工厂。

但是就当前这个计算器项目而言,还有一个重要问题,当客户端不确定需要哪些产品(oper的不可预知性),那么我到底用哪个工厂进行生产呢?

当我们需要多个对象一起应用并且他们的约束是不可分离的时候,比如客户需要一辆车,那么就应该有一个专门造车的工厂,组装所有的工厂生产的零件,这就是抽象工厂的好处。

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值