《设计模式》--简单工厂模式

简单工厂模式(静态工厂)

认识

在工厂类中提高一个工厂方法,根据参数类型实例化不同的对象返回给客户端

思考

  • 定义:提供一个创建对象实例的功能,无须关心细节和具体实现。

  • 面向接口编程,只知道接口,不知道实现类

  • 本质是:选择实现

使用场景

  1. 当需要封装实现细节,外部不知道具体实现只能通过接口来操作封装体的时候,可以选择简单工厂,让客户端通过简单工厂提供的方法获取相应的接口实现。
  2. 当想要把创建对象的职责、权限集中在内部管理和控制时,选择简单工厂,例如简单工厂加单例模式控制创建对象。

优缺点

  • 优点

    1. 封装实现细节
    2. 解耦
  • 缺点

    1. 增加客户端复杂度
    2. 不方便扩展子工厂

UML图

客户端只能够访问接口和工厂类,具体实现细节对客户端透明,工厂方法一般都是静态的,根据客户端调用传入的参数去实例化不同的实现类对象。

image

代码实现

在工厂方法中也可以通过读取外部配置文件中的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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值