浅谈常用设计模式——简单工厂模式

简单工厂模式

  • 简介:面向对象的三大特性,封装、继承和多态。简单工厂设计模式巧妙地利用了这三个特性,解决了编程过程中类单一职责、对象实例创建的问题。
  • 职能:实现了对象实例的统一创建,使程序设计松耦合,类职责清晰,在对象内实现方法、外界调用接口、工厂中实例类型发生变化时,改动较小。
  • 应用:工厂创建对象实例,如著名的spring的bean工厂。

本文将用简单工厂模式,实现一个类似计算器的运算程序的设计。该运算程序实现了加减乘除等运算方法,输入数字和运算符,输出运算结果。设计思路是,抽取一个公共的运算接口,加减乘除等运算类均实现这个接口并且重写运算接口,用一个运算工厂类,来完成加减乘除类对象实例的创建,并根据输入的运算符来创建不同的对象并调用不同的实现方法。

简单工厂模式类关系图

运算公共接口

package factory;
/**
 * 运算参数公共接口
 * @author jsyuger
 *
 */
public interface OperationIntf {
	public int operation(int a ,int b) throws Exception;
}

加法实现类

package factory;
/**
 * 加法
 * @author jsyuger
 *
 */
public class AddOperation implements OperationIntf{
	@Override
	public int operation(int a , int b) {
		return a+b;
	}
}

减法实现类

package factory;
/**
 * 减法
 * @author jsyuger
 *
 */
public class SubtractionOperation implements OperationIntf{
	@Override
	public int operation(int a, int b) {
		return a-b;
	}
}

乘法实现类

package factory;
/**
 * 乘法
 * @author jsyuger
 *
 */
public class MultiOperation implements OperationIntf{
	@Override
	public int operation(int a, int b) {
		return a*b;
	}
}

除法实现类

package factory;
/**
 * 除法
 * @author jsyuger
 * 被除数为0则抛异常
 */
public class DivisionOperation implements OperationIntf{
	@Override
	public int operation(int a, int b) throws Exception {
		if(b == 0) throw new Exception("被除数不能为0!");
		return a/b;
	}
}

运算工厂类(factory)

package factory;
/**
 * 运算工厂
 * @author jsyuger
 * 用于创建加减乘除运算类的对象实例
 */
public class OperationFactory {
	//根据不同的运算符创建不同的对象并调用对应的运算方法
	public int operator(int a,int b,char c) throws Exception {
		int result = -1 ;
		switch(c) {
			case '+' : result = new AddOperation().operation(a, b); break;
			case '-' : result = new SubtractionOperation().operation(a, b); break;
			case '*' : result = new MultiOperation().operation(a, b); break;
			case '/' : result = new DivisionOperation().operation(a, b); break;
			default : throw new Exception("unkowned opertion!"); 
		}
		
		return result ;
		
	}
}

测试类(client)

package factory;

import org.junit.Test;
/**
 * 测试类
 * @author jsyuger
 *
 */
public class OperationTest {
	@Test
	public void test() throws Exception {
		OperationFactory OperationFactory = new OperationFactory();
		System.out.println(OperationFactory.operator(18, 6, '+'));
		System.out.println(OperationFactory.operator(18, 6, '-'));
		System.out.println(OperationFactory.operator(18, 6, '*'));
		System.out.println(OperationFactory.operator(18, 6, '/'));
		System.out.println(OperationFactory.operator(18, 6, '%'));
	}
}

至此结束,感谢收看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值