首先说明什么是简单工厂模式:(取自百度百科)
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
用途:
外界不必关心创建对象的具体细节,只需要调用工厂方法,然后使用对象即可,一般只在简单的情况下使用。
缺点:
工厂类中所能创建的类只可以是事先考虑好的,若要新增类,则要改变工厂类,这在一定程度上违反了“开-闭原则”。
代码示例(代码功能为简单的计算器,给定两个值,输出结果)
代码结构:
代码很简单,不过用到了简单工厂模式设计;
首先,IOperation接口,定义了计算结果的方法,每个实现该接口的类必须重写该方法
package com.operation.intf;
/**
* 计算接口,让每一个运算符继承
*
* @author ZHENGWEI
*
*/
public interface IOperation {
/**
* 计算结果的方法
*
* @return 最后计算结果
*/
public double getResult(double numberOne, double numberTwo);
}
其次,实现这个接口的AddOperation类,重写了getResult方法,返回他们相加的结果
package com.operation.impl;
import com.operation.intf.IOperation;
/**
* 加法的实现类
*
* @author ZHENGWEI
*
*/
public class AddOperation implements IOperation {
/**
* 返回加法结果
*/
public double getResult(double numberOne, double numberTwo) {
return numberOne+numberTwo;
}
}
下边重点来了,OperationFactory工厂类,负责创建实例对象
package com.operation.factory;
import com.operation.impl.AddOperation;
import com.operation.intf.IOperation;
/**
* 生成运算对象的简单工厂类
*
* @author ZHENGWEI
*
*/
public class OperationFactory {
/**
* 根据不同参数,返回不同类的实例
*
* @param opera
* @return
*/
public static IOperation creatrOperation(int opera) {
IOperation iOperation = null;
switch (opera) {
case 1:
iOperation = new AddOperation();
break;
default:
break;
}
return iOperation;
}
}
需要说明的是,这里的静态方法之所以接收int型,是因为java本身并不支持在switch-case中匹配String型数据,否则直接将“+”,“-”等符号传过来就ok啦,这里1代表加法
下面是测试类
package com.operation.main;
import com.operation.factory.OperationFactory;
import com.operation.intf.IOperation;
public class TestMain {
/**
* 测试类
* @param args
*/
public static void main(String[] args) {
//测试类只需要与工厂类耦合
IOperation iOperation = OperationFactory.creatrOperation(1);
System.out.println(iOperation.getResult(1,1));
}
}
很明显,输出结果为2.0,并且,测试类TestMain并没有与AddOperation类耦合,它是通过工厂类返回一个AddOperation类的实例,当需要创建的类较多时,这种优势极为明显。
若现在需求发生变化,要增加一个减法类,则只需以下步骤
1、新建类SubOperation,并且实现IOperation接口
package com.operation.impl;
import com.operation.intf.IOperation;
/**
* 减法的实现类
*
* @author ZHENGWEI
*
*/
public class SubOperation implements IOperation {
/**
* 返回减法计算结果
*/
public double getResult(double numberOne, double numberTwo) {
return numberOne - numberTwo;
}
}
2、修改OperationFactory工厂类,修改后如下(只需加一个case语句)
package com.operation.factory;
import com.operation.impl.AddOperation;
import com.operation.impl.SubOperation;
import com.operation.intf.IOperation;
/**
* 生成运算对象的简单工厂类
*
* @author ZHENGWEI
*
*/
public class OperationFactory {
/**
* 根据不同参数,返回不同类的实例
*
* @param opera
* @return
*/
public static IOperation creatrOperation(int opera) {
IOperation iOperation = null;
switch (opera) {
case 1:
iOperation = new AddOperation();
break;
case 2:
iOperation = new SubOperation();
break;
default:
break;
}
return iOperation;
}
}
3、测试类
//原来的
IOperation iOperation = OperationFactory.creatrOperation(1);
System.out.println(iOperation.getResult(1,1));
//现在的
IOperation iOperation = OperationFactory.creatrOperation(2);
System.out.println(iOperation.getResult(1,1));
显然,第一个是2.0,第二个是0.0
其他的操作也一样,只需增加新类,在工厂类中增加逻辑判断即可。