简单工厂模式

以简单的计算器实现为例。

一、普通方法实现简单计算器。

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		double NumA;
		double NumB;
		String sign;
		NumA = scan.nextDouble();
		NumB = scan.nextDouble();
		sign = scan.next();
		double result = 0;
		switch (sign) {
		case "+":
			result = NumA + NumB;
			break;
		case "-":
			result = NumA - NumB;
			break;
		case "*":
			result = NumA * NumB;
			break;
		case "/":
			if (NumB != 0) {
				result = NumA / NumB;
			} else {
				System.out.println("除数不能为0");
			}
			break;
		default:
			break;
		}
		//return result;
	}

二、用面向对象的思想去改进代码--业务逻辑与界面逻辑分开,使他们的耦合度下降;

Operation预算类:

public static double Operation(double NumA, double NumB, String operate) {

		double result = 0;
		switch (operate) {
		case "+":
			result = NumA + NumB;
			break;
		case "-":
			result = NumA - NumB;
			break;
		case "*":
			result = NumA * NumB;
			break;
		case "/":
			if (NumB != 0) {
				result = NumA / NumB;
			} else {
				System.out.println("除数不能为0");
			}
			break;
		default:
			break;
		}
		return result;
	}

客户端代码:

public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		double NumA;
		double NumB;
		String sign;
		NumA = scan.nextDouble();
		NumB = scan.nextDouble();
		sign = scan.next();
		System.out.println(Operation(NumA, NumB, sign));
	}

上面的代码虽然实现了面向对象中的封装,但是如果要添加一种计算方式(如:开根运算)还不是很方便,添加一个case的话,其余的运算也得参与编译,使代码存在被二次修改的风险。

三、用继承和多态进一步解耦;

1.封装运算类;

public class Operation {
	private double NumA;
	private double NumB;
	public double getNumA() {
		return NumA;
	}
	public void setNumA(double numA) {
		NumA = numA;
	}
	public double getNumB() {
		return NumB;
	}
	public void setNumB(double numB) {
		NumB = numB;
	}
  public double GetResult() {

	  double result  = 0;
	  return result;
}
}

2.加减乘除类(继承运算类);

public class AddOperation extends Operation{

	@Override
	public double GetResult() {

		double result = 0;
		result = getNumA() + getNumB() ;
		return result;
	}

public class SubOperation extends Operation {

	@Override
	public double GetResult() {
            double result = 0;
            result = getNumA() - getNumB();
            return result;
	}
public class MulOperation extends Operation{

	@Override
	public double GetResult() {

		double result = 0;
		result = getNumA() * getNumB();
		return result;

	}

	
}

public class DivOperation extends Operation{

	@Override
	public double GetResult() {
          double result = 0;
          if (getNumB()==0)
			try {
				throw new Exception("除数不能为0;");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	  result = getNumA() / getNumB();
        	  return result;
		
	}

	
}
3.简单工厂类(用一个单独的类来创造容易变化的地方的实例过程),用多态确定选择的运算。

public class OperationFactory {

	public static Operation createOperation(String operate) {

		Operation oper = null;
		switch (operate) {
		case "+":
			oper = new AddOperation();
			break;
		case "-":
			oper = new SubOperation();
			break;
		case "*":
			oper = new MulOperation();
			break;
		case "/":
			oper = new DivOperation();
			break;
		default:
			break;
		}
		return oper;
	}
}
客户端代码

public class Main {
	public static void main(String[] args) {
		Operation oper;
		oper = OperationFactory.createOperation("+");
		oper.setNumA(2);
		oper.setNumB(3);
		double result = oper.GetResult();
		System.out.println(result);
	}

}

经过上述修改的简单计算器运用面向对象思想,实现封装、继承、多态等特性,达到了代码 可复用、可扩展、灵活性好的目的。

四、UML图






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值