简单工厂模式(静态工厂)
认识
在工厂类中提高一个工厂方法,根据参数类型实例化不同的对象返回给客户端
思考
定义:提供一个创建对象实例的功能,无须关心细节和具体实现。
面向接口编程,只知道接口,不知道实现类
本质是:选择实现
使用场景
- 当需要封装实现细节,外部不知道具体实现只能通过接口来操作封装体的时候,可以选择简单工厂,让客户端通过简单工厂提供的方法获取相应的接口实现。
- 当想要把创建对象的职责、权限集中在内部管理和控制时,选择简单工厂,例如简单工厂加单例模式控制创建对象。
优缺点
优点
- 封装实现细节
- 解耦
缺点
- 增加客户端复杂度
- 不方便扩展子工厂
UML图
客户端只能够访问接口和工厂类,具体实现细节对客户端透明,工厂方法一般都是静态的,根据客户端调用传入的参数去实例化不同的实现类对象。
代码实现
在工厂方法中也可以通过读取外部配置文件中的class name进行反射创建对象,实现可配置。例如将数据库驱动的class 配置在外部properties中,在工厂方法中读取到驱动类反射创建,之后想更改驱动的时候直接更改配置文件即可。
/**
* 静态工厂
*/
public class Factory {
public static IOperate createClass(String regix){
IOperate operate =null;
char myRegix = regix.charAt(0);
switch(myRegix){
case '+' :
operate = new Add();
break;
case '-' :
operate = new Sub();
break;
case '*' :
operate = new Mul();
break;
case '/' :
operate = new Div();
break;
default :
throw new RuntimeException("你输出的运算符不符合该计算器");
}
return operate;
}
public Factory() {
}
}
/**
* 接口
*
*/
public interface IOperate {
public double firstNum = 0;
public double secondNum = 0;
public double getResult(double firstNum,double secondNum);
}
/**
*实现类
*/
class Add implements IOperate{
public double getResult(double firstNum, double secondNum) {
double result = firstNum + secondNum;
return result;
}
}
class Sub implements IOperate{
public double getResult(double firstNum, double secondNum) {
double result = firstNum - secondNum;
return result;
}
}
class Mul implements IOperate{
public double getResult(double firstNum, double secondNum) {
double result = firstNum * secondNum;
return result;
}
}
class Div implements IOperate{
public double getResult(double firstNum, double secondNum) {
if(secondNum == 0){
throw new RuntimeException("被除数不能为0");
}
double result = firstNum / secondNum;
return result;
}
}