简单工厂模式
- 简介:面向对象的三大特性,封装、继承和多态。简单工厂设计模式巧妙地利用了这三个特性,解决了编程过程中类单一职责、对象实例创建的问题。
- 职能:实现了对象实例的统一创建,使程序设计松耦合,类职责清晰,在对象内实现方法、外界调用接口、工厂中实例类型发生变化时,改动较小。
- 应用:工厂创建对象实例,如著名的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, '%'));
}
}
至此结束,感谢收看。