简单工厂模式:实质是一个工厂类根据传入的参数,动态决定创建哪个产品类的实例,这些产品类继承自一个类或接口;
解决问题:到底实例化谁,将来会不会增加实例化的对象;对于很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程。
实例:输入两个数和运算符,得到运算结果
1、创建抽象对象类Operation.java,具体对象类OperateAdd,java,OperateDivide.java,OperateMultiply.java,OperateSubtrct.java,工厂类OperateFactory.java,视图类OperateMain.java
2、具体实现
OperateMain.java:
package com.test.factory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; import com.sun.corba.se.spi.orb.OperationFactory; public class OperateMain { private static int numberA; private static int numberB; private static InputStreamReader inputStreamReader; private static BufferedReader bufferReader; public static void main(String[] args){ try { System.out.println("please input a number:"); inputStreamReader = new InputStreamReader(System.in); bufferReader = new BufferedReader(inputStreamReader); numberA = Integer.parseInt(bufferReader.readLine()); System.out.println("please input a operate:"); Scanner input = new Scanner(System.in); String operate = input.next(); System.out.println("please input a number again:"); inputStreamReader = new InputStreamReader(System.in); bufferReader = new BufferedReader(inputStreamReader); numberB = Integer.parseInt(bufferReader.readLine()); Operation oper = OperateFactory.createOperation(operate); oper.numberA = numberA; oper.numberB = numberB; System.out.println(numberA + operate + numberB + " = "+oper.getResult()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Operation.java:
package com.test.factory; public class Operation { public int numberA,numberB; public float result; public float getResult(){ return result; } }
OperateAdd.java:
package com.test.factory; public class OperateAdd extends Operation{ @Override public float getResult() { // TODO Auto-generated method stub return numberA + numberB; } }
OperateFactory.java:
package com.test.factory; public class OperateFactory { public static Operation createOperation(String operate){ if (operate.equals("+")){ return new OperateAdd(); } else if(operate.equals("-")) { return new OperateSubtract(); } else if (operate.equals("*")){ return new Operatemultiply(); } else if (operate.equals("/")){ return new OperateDivide(); } return null; } }
3、Operation类中两个int属性,一个getResult方法行为;
加减乘除类都继承Operation类,重写getResult方法;
OperationFactory为工厂类,根据传入的String参数,动态创建具体运算类,创建何种运算类,怎么创建,都在这个类中实现;
4、运行如下:
优点
工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
这些缺点在工厂方法模式中得到了一定的克服。
使用场景
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。