简单工厂模式:实质是一个工厂类根据传入的参数,动态决定创建哪个产品类的实例,这些产品类继承自一个类或接口;
解决问题:到底实例化谁,将来会不会增加实例化的对象;对于很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程。
实例:输入两个数和运算符,得到运算结果
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、运行如下:
优点
工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
这些缺点在工厂方法模式中得到了一定的克服。
使用场景
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
工厂方法模式VS简单工厂模式
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类对于客户端来说,去除了与具体产品的依赖。工厂方法模式:定义了一个用于创建对象接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工厂方法模式实现时,客户端需要决定实例化哪一个工厂类来实现运算类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂内容判断移到了客户端来判断。简单工厂主要的缺点是违背的开放-封闭原则。