简单工厂模式

  前言,搞开发2年了,一直没法写出高质量的代码。对比别人写的代码,感觉自己还是在设计模式这块应用的不够灵活。利用年终事少,恶补一下。闲话不多说,下面先介绍下简单工厂模式。  阅读了《大话设计模式》第一章,介绍了简单工厂模式,不过是.net语言写的。个人觉得尽管对简单工厂的概念一知半解了,但是还是实际写一遍才会理解更加深刻。题目:实现一个计算器运算(+,-,*,/) //节省时间,借用下别人代码

		
     double result = 0;
		// 1.接收控制台输入
		System.out.println("-----计算器程序-----");
		System.out.println("输入第一个操作数");
		Scanner scan = new Scanner(System.in);
		String strNum1 = scan.nextLine();
		System.out.println("输入运算符");
		String oper = scan.nextLine();
		System.out.println("输入第二个操作数");
		String strNum2 = scan.nextLine();
		// 2.进行运算
		if ("+".equals(oper)) {
			result = Double.parseDouble(strNum1) + Double.parseDouble(strNum2);
		} else if ("-".equals(oper)) {
			result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2);
		} else if ("*".equals(oper)) {
			result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2);
		} else if ("/".equals(oper)) {
			result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2);
		}
		System.out.println(strNum1 + oper + strNum2 + "=" + result);

相信大多数人没有考虑设计模式的人都会这样实现的,其实这是面向过程的一种思想,想到哪写到哪,可维护,可扩展性差。

(具体原因不多说,想具体了解去看看大话设计模式)

通过工厂模式实现如下:

(1)定义一个抽象类

/**
 * 实现面向对象业务封装
 * 
 * @author wgd
 *
 */
public abstract class IOperation {

	public abstract double getResult();

	private double numberA, numberB;

	public double getNumberB() {
		return numberB;
	}

	public void setNumberB(double numberB) {
		this.numberB = numberB;
	}

	public double getNumberA() {
		return numberA;
	}

	public void setNumberA(double numberA) {
		this.numberA = numberA;
	}

}
(2)增加实现具体业务的操作子类,由于乘法和除法大同小异不过多介绍。
/**
 * 实现加法
 * 
 * @author wgd
 *
 */
public class AddOperation extends IOperation {

	@Override
	public double getResult() {
		return getNumberA() + getNumberB();
	}

}

/**
 * 实现减法
 * 
 * @author wgd
 *
 */
public class SubOpreation extends IOperation {

	@Override
	public double getResult() {
		return getNumberA() - getNumberB();
	}

}

(3)通过简单工厂类管理操作子类

/**
 * 简单工厂管理操作类
 * @author wgd
 *
 */
public class FactoryOperation {
	public static IOperation createOperaton(String operate) {
		IOperation operation = null;

		switch (operate) {
			case "+":
				operation = new AddOperation();
				break;
			case "-":
				operation = new SubOpreation();
				break;
			default:
				break;
		}
		return operation;
	}
}

(4)实例化操作类
public class ExampleTest {

	public static void main(String[] args) {

		 double numberA = 3d, numberB = 5d, result = 0d;
		 IOperation iOperation = FactoryOperation.createOperaton("-");// 简单工厂
		 iOperation.setNumberA(numberA);
		 iOperation.setNumberB(numberB);
		 result = iOperation.getResult();
		 System.out.println("result==" + result);

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值