标签:
模式定义
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例,简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类
模式结构
1.Factory:工厂角色
工厂角色负责实现创建所有实例的内部逻辑
2.Product:抽象产品角色
抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
3.ConcreteProduct:具体产品角色
具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例
实例
背景:通过一个简单的计算器<加减乘除>来说明这个模式
1.创建一个工厂,这个类主要是通过传进去的运算符来生成对应的运算类
public class OperationFactory {
public static Operation createOperation (String operate) {
Operation operation = null;
switch(operate) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSubtract();
break;
case "*":
operation = new OperationMultiply();
break;
case "/":
operation = new OperationDivide();
break;
}
return operation;
}
}
2.定义抽象出来的运算接口
public interface Operation {
//获取两位数计算的结果
public int getResult(int numberOne,int numberTwo);
}
3.每个运算类分别去实现Operation 接口
/**
* 加法运算
* @author shengfenglai
*/
public class OperationAdd implements Operation {
@Override
public int getResult(int numberOne, int numberTwo) {
return numberOne + numberTwo;
}
}
/**
* 减法运算
* @author shengfenglai
*/
public class OperationSubtract implements Operation {
@Override
public int getResult(int numberOne, int numberTwo) {
return numberOne - numberTwo;
}
}
/**
* 乘法运算
* @author shengfenglai
*/
public class OperationMultiply implements Operation {
@Override
public int getResult(int numberOne, int numberTwo) {
return numberOne * numberTwo;
}
}
/**
* 除法运算
* @author shengfenglai
*/
public class OperationDivide implements Operation {
@Override
public int getResult(int numberOne, int numberTwo) {
int result = 0;
if(numberTwo != 0) {
result = numberOne / numberTwo;
}else {
throw new NotBeZeroException("除数不能为0");
}
return result;
}
}
4.自定义一个异常,用来除数为0的时候抛出
public class NotBeZeroException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 9056463784173674087L;
public NotBeZeroException(String msg) {
super(msg);
}
}
5.测试类
public class OperationTest {
public static void main(String[] args) {
//test for add
Operation addOperation = OperationFactory.createOperation("+");
int addResult = addOperation.getResult(1,2);
System.out.println("1 + 2 = " + addResult);
//test for subtract
Operation subtractOperation = OperationFactory.createOperation("-");
int subtractResult = subtractOperation.getResult(9,5);
System.out.println("9 - 5 = " + subtractResult);
//test for multiply
Operation multiplyOperation = OperationFactory.createOperation("*");
int multiplyResult = multiplyOperation.getResult(4,6);
System.out.println("4 * 6 = " + multiplyResult);
// test for divide
Operation divideOperation = OperationFactory.createOperation("/");
int divideResult = divideOperation.getResult(8,4);
//int divideResult = divideOperation.getResult(8,0);
System.out.println("8 / 4 = " + divideResult);
}
}
模式优点
模式的核心是工厂类,该类中含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。简单工厂模式实现了对责任的分割。
模式缺点
1.工厂类用静态方法作为工厂类,这样就没办法由子类继承,所以没办法形成继承的等级结构
2.将多个创建逻辑放在一个类中,当产品类有不同接口种类时,工厂类需要判断在什么时候创建某种产品,使得系统在将来进行功能扩展时较为困难。就是if else 会越来越多,不利于维护
3.只适用于工厂类负责创建的对象比较少时
标签:
原文地址:http://my.oschina.net/lsf930709/blog/531672