A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 佘显郡 中级黑马   /  2013-10-23 17:28  /  1476 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 佘显郡 于 2013-10-29 16:20 编辑

一个工厂模式的计算器,封装所有运算符为类,统一继承ICalculator接口实现计算,写一个Factory类,有一个静态create方法,该方法返回运算符类,但是如果运算符类所需要的参数不一样,怎么解决,急求。
    interface ICalculate
    {
        //由于有一目,二目,多目运算符,计算需要的参数直接封装在运算符类中
        object Calculate();
    }

工厂类,求如何实现参数的不同问题,简单说就是生产需要的原材料会不一样的,怎么传原材料,用个params,然后下面判断?
   class Factory
    {
        public static ICalculate Create(string oper,params int[]nums)
        {
            switch (oper)
            {
                case "+":return new Add()
                default:
            }
        }
    }

评分

参与人数 1技术分 +1 收起 理由
陈行 + 1

查看全部评分

2 个回复

正序浏览
对于 单目、双目、多目  你可以使用策略工厂模式,对策略类进行实例化,由于代码太多,只写一部分,如下:

//这是对 单目、双目、多目的策略
  public class taskFactory
    {
        private static OperaterTask ot = null;
        public static OperaterTask getTaskType(string str) //str 为表示单目、双目、多目
        {
            switch (str)
            {
                case "single":
                    {
                        ot = new OperaterTaskSingle();
                        break;
                    }
                case "double":
                    {
                        ot = new OperaterTaskDouble();
                        break;
                    }
                case "mul":
                    {
                        ot = new OperaterTaskMulti();
                        break;
                    }
            }
            return ot;
        }
    }

//这是双目的策略,其他类似

public class OperaterTaskDouble:OperaterTask
    {
        public bool isNew = false;
        public override double getTaskResult(string str, double num)
        {
            if (op ==null)
            {
                op = new OperaterFactory().getOperater(str);
                this.op.OpA = num;
                return num;
            }
            else
            {
                this.op.OpB = num;
                double stmp = op.getResult();
                op = new OperaterFactory().getOperater(str);
                this.op.OpA = stmp;
                this.isNew = true;
                return stmp;
            }
        }
    }

//这个就是你说的封装所有运算符为类

public class OperaterFactory
    {
        public Operater getOperater(string str)
        {
            Operater op = null;
            switch (str)
            {
                case "+":
                    {
                        op = new OperaterAdd();
                        return op;
                    }
                case "-":
                    {
                        op = new OperaterSub();
                        return op;
                    }
                case "*":
                    {
                        op = new OperaterMul();
                        return op;
                    }
                case "/":
                    {
                        op = new OperaterDiv();
                        return op;
                    }
                case "Pow"://如2的3次方
                    {
                        op = new OperaterSqrt();
                        return op;
                    }
                case "1/x":
                    {
                        op = new OperaterDao();
                        return op;
                    }
                case "mod":
                    {
                        op = new OperaterYu();
                        return op;
                    }
                case "AD":
                    {
                        op = new OperaterAD();
                        return op;
                    }
                case "Sqrt": //开方
                    {
                        op = new OperaterPow();
                        return op;
                    }
                case "x^2": //平方
                    {
                        op = new OperaterPf();
                        return op;
                    }
                default:
                    {
                        return op = null;
                    }
            }
        }
    }

以上你可以参考,太多了,没有办法全写

评分

参与人数 1技术分 +2 收起 理由
陈行 + 2 赞一个!

查看全部评分

回复 使用道具 举报
这个问题都没人回答,表示很蛋疼,不过还好自己已经解决了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马