简单工厂模式--女娲造人造啥做啥

有这样一个问题,以面向对象的方法去实现一个简单的计算器该怎么实现呢?

首先,有种很简单的思路,输入两个数,然后判断运算符类型,进行相应运算,最后输出结果。

这样的方法虽然也能完成,但是不符合面向对象的方法,并且如果有一种新加的运算符时,会显得十分

的冗余而不好更改。

那有没有一种更好的方法呢?

这就是简单工厂模式,理解就是女娲造人造啥做啥,工作类有相似的操作功能,并且当新加如

功能类时,不影响以及不需要修改其他的功能类。

先给出类图:




Operation类是一个抽象类,除了有两个成员变量外,还有个需要子类实现的抽象方法getResult();

统一的通过OperationFactory类去获得实例Operation的子类,根据特定的传入命令,要啥获得啥;

这样一来,如果要新加入一种计算功能,从类图上看,只需要添加一个类继承Operation,

并且在OperationFactory中加入相应实例化语句就行,而不需要动其他的类。

下面看详细的代码:

Operation类:

package com.blog.anla.SimpleFactory;

public abstract class Operation {
	protected double numberA;
	protected double numberB;
	/**
	 * 得到运算结果
	 * @return
	 */
	public abstract double getResult();
}

OperationAdd类:

package com.blog.anla.SimpleFactory;

public class OperationAdd extends Operation{

	@Override
	public double getResult() {
		return numberA + numberB;
	}
	
}


OperationSub类:

package com.blog.anla.SimpleFactory;

public class OperationSub extends Operation{

	@Override
	public double getResult() {
		return numberA - numberB;
	}

}


OperationMul类:

package com.blog.anla.SimpleFactory;

public class OperationMul extends Operation{

	@Override
	public double getResult() {
		return numberA*numberB;
	}

}


OperationDiv类:

package com.blog.anla.SimpleFactory;

public class OperationDiv extends Operation{

	@Override
	public double getResult() {
		if(numberB != 0){
			return numberA / numberB;
		}else{
			return 0;
		}
	}
	
}


OperationFactory类:

package com.blog.anla.SimpleFactory;
/**
 * 简单工厂,需要啥类就考虑用一个
 * 单独的类来创造示例工程。
 * 降低了功能类之间的耦合性,如果要添加一个新功能,
 * 仅仅需要加相应的类,而不需要更改其他的类
 * @author U-ANLA
 *
 */
public class OperationFactory {
	public static Operation createOperate(char 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;
		}
		return oper;
	}
	
	public static void main(String[] args) {
		Operation oper = OperationFactory.createOperate('+');
		oper.numberA = 1;
		oper.numberB = 2;
		System.out.println(oper.getResult());
	}
}

赠人玫瑰手留余香,希望对大家有用哈

 ~( ̄▽ ̄~)~






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值