简单工厂模式(Simple Factory Pattern)

2018-08-24  本文已影响0人  笨笨翔

简单工厂模式(Simple Factory Pattern)

1.1 模式动机

考虑一个简单的软件应用场景,一个简单计算器的实现。一个计算机可以提供多种不同的计算方法,而这些计算方法都可以源于一个基类或接口。不过就是在继承基类后子类又修改各自不同的计算方法。如果我们希望在使用这些类时,不需要知道具体计算类的名字,只需要知道表示该类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。

1.2 模式定义

简单工厂模式(Simple Factory Pattern): 又称静态工厂方法模式(Static Factory Method),它属于类创建型模式。在简单工厂模式中,可以根据参数不同返回不通类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

1.3 模式结构

简单工厂模式包含如下角色

  1. Factory:工厂角色
      工厂角色负责实现所有实例的内部角色
  2. Product:抽象产品角色
      抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口。

1.4 代码分析

/**
 * 运算类,父类
 */
public abstract class Operation {
    private double numberA = 0;
    private double numberB = 0;

    Operation(double numberA, double numberB){
        this.numberA = numberA;
        this.numberB = numberB;
    }
    Operation(){}
    /**
     * 计算方法,获取最终结算结构
     * @return
     * @throws Exception
     */
    abstract double getResult() throws Exception;
    public double getNumberA() {
        return numberA;
    }
    public void setNumberA(double numberA) {
        this.numberA = numberA;
    }
    public double getNumberB() {
        return numberB;
    }
    public void setNumberB(double numberB) {
        this.numberB = numberB;
    }
}


/**
 * 加法类
 */
public class OperationAdd extends Operation {
    OperationAdd(double numberA, double numberB) {
        super(numberA, numberB);
    }

    OperationAdd(){}

    @Override
    double getResult() {
        return getNumberA() + getNumberB();
    }
}

/**
 * 剪发累
 */
public class OperationDel extends Operation {
    OperationDel(){}

    OperationDel(double numberA, double numberB){
        super(numberA,numberB);
    }
    @Override
    double getResult() {
        return getNumberA() - getNumberB();
    }
}

/**
 * 除法类
 */
public class OperationDIv extends Operation {
    @Override
    double getResult() throws Exception {
        if(getNumberB() == 0)
            throw new Exception("除数不能为0");
        return 0;
    }
}

/**
 * 乘法类
 */
public class OperationMul extends Operation {
    OperationMul(){}

    OperationMul(double numberA, double numberB){
        super(numberA,numberB);
    }

    @Override
    double getResult() {
        return getNumberA() * getNumberB();
    }
}

/**
 * 工厂类
 */
public class OperationFactory {

    public static Operation create(String oper){
        switch (oper){
            case "+" : return new OperationAdd();
            case "-" : return new OperationDel();
            case "*" : return new OperationMul();
            case "/" : return new OperationDIv();
            default:
                return null;
        }
    }
}

1.5 模式分析

  1. 将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。
  2. 在调用工厂类的工厂方法时,由于工厂方法是静态的,使用起来比较方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数时无需修改任何源代码
  3. 简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点于开闭原则是相违背的。
  4. 简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

1.6 实例

同1.5代码分析。

1.7 简单工厂模式的优点

1.8 简单工厂模式的缺点

1.9 使用环境

在以下情况可以使用简单工厂模式:

2.0 模式应用

  1. JDK类库中广泛使用了简单工厂模式,如工具类java.texst.DateFormat,它用于格式化一个本地日期或者时间。
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale
locale);
  1. Java加密技术
    获取不通加密算法的密钥生成器:
KeyGenerator keyGen=KeyGenerator.getInstance("DESede");

创建密码器:

Cipher cp=Cipher.getInstance("DESede");

2.1 总结

参照:图说设计模式

上一篇 下一篇

猜你喜欢

热点阅读