标签:
模式定义
简单工厂模式(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