简单工厂模式是属于创建型模式,也叫做静态工厂方法。该模式就是定义了要给创建对象的类,由这个类来封装实例化的对象。
例如要设计一个计算器程序,计算器会涉及加、加、乘、除等。如果传统的开发方式,直接写一个类,根据用户输入的符号进行指定的运算,虽然能实现功能,但加、加、乘、除等运算方法耦合度比较高,而且如果想要新增加一个计算方法,需要修改整个类,风险较高。
package designPattern.chap1;
import java.util.Scanner;
/*
* 计算器控制台程序
* 传统模式开发代码示例
*/
public class Demo1_1 {
public static void main(String args[]) {
System.out.print("请输入数字:");
Scanner in = new Scanner(System.in);
int number1 = in.nextInt();
System.out.println();
System.out.print("请输入符号:");
Scanner in1 = new Scanner(System.in);
String str1 = in1.next();
System.out.print("请输入数字:");
Scanner in2 = new Scanner(System.in);
int number2 = in2.nextInt();
if(str1.trim().equals("+")) {
System.out.println(number1 + number2);
}else if(str1.trim().equals("-")) {
System.out.println(number1 - number2);
}else if(str1.trim().equals("*")) {
System.out.println(number1 * number2);
}
in.close();
in1.close();
in2.close();
}
}
类似计算器这样的问题,其实可以采用工厂模式来设计。采用工厂模式,可以实现计算和输入输出解耦。基于此可以先对计算过程进行一个抽象,定义一个计算方法getResult(就是对加、加、乘、除等具体计算过程的抽象),计算方法需要两个数据作为参数。采用VISIO的静态结构模板画出来的UML图以及代码分别如下。
package designPattern.chap1;
import java.util.Scanner;
/*
* 启动类
*/
public class Demo1_1MainClass {
public static void main(String args[]) {
Scanner in1 = null;
Scanner in2 = null;
Scanner in3 = null;
try {
System.out.print("请输入第一个数字:");
in1 = new Scanner(System.in);
double numberA = in1.nextDouble();
System.out.print("请输入运算符号:");
in2 = new Scanner(System.in);
String str = in2.next();
System.out.print("请输入第二个数字:");
in3 = new Scanner(System.in);
double numberB = in3.nextDouble();
OperationInterface operObject = OperationFactory.createOperation(str.trim());
System.out.println("结果是:"+operObject.getResult(numberA, numberB));
}catch(Exception e) {
System.out.println("计算异常:"+e.getCause().toString());
}finally {
in1.close();
in2.close();
in3.close();
}
}
}
package designPattern.chap1;
/*
* 定义operationInterface接口
*/
public interface OperationInterface {
public double numberA = 0;
public double numberB = 0;
public double getResult(double numberA,double numberB);
}
package designPattern.chap1;
/*
* 加法实现操作
*/
public class OperationAdd implements OperationInterface{
@Override
public double getResult(double numberA, double numberB) {
// TODO Auto-generated method stub
return numberA+numberB;
}
}
package designPattern.chap1;
/*
* 乘法
*/
public class OperationMul implements OperationInterface{
@Override
public double getResult(double numberA, double numberB) {
// TODO Auto-generated method stub
return numberA*numberB;
}
}
package designPattern.chap1;
/*
* 减法
*/
public class OperationSub implements OperationInterface{
@Override
public double getResult(double numberA, double numberB) {
// TODO Auto-generated method stub
return numberA-numberB;
}
}
package designPattern.chap1;
/*
* 工厂类
*/
public class OperationFactory {
public static OperationInterface createOperation(String operaiton) {
OperationInterface operObject = null;
switch(operaiton) {
case "+":
operObject = new OperationAdd();
break;
case "-":
operObject = new OperationSub();
break;
case "*":
operObject = new OperationMul();
break;
}
return operObject;
}
}