JAVA后台开发_从入门到精通

2 简单工厂模式

2019-12-31  本文已影响0人  笑Skr人啊

1 简介

简单工厂模式不属于23种设计模式(工厂模式的简化)

定义
    定义一个创建产品对象的工厂接口,将产品对象的实际创建工作放到工厂类当中

简单工厂一般分为
    普通简单工厂
    多方法简单工厂
    静态方法简单工厂

缺点  
  违背了开闭原则
  当需要增加一个新的功能时(eg:增加乘法运算),需要添加一个乘法运算实体类,然后修改工厂类

2 UML图介绍

2.1 类

运算符矩形框,代表一个类(Class)

类图分三层
  第一层
    类的名称,如果是抽象类,则用斜体表示
  第二层
      类的字段和属性
  第三层
    类的方法

前面的符号
  + 表示 public
  - 表示 private
  # 表示 protected

2.2 继承(extends)

继承
继承用 空三角+实线 表示

当一个类继承另一个类时,用继承
鸟继承动物

2.3 关联

关联
关联用 实线箭头 表示

当一个类知道另一个类时,用关联

public class 企鹅{
    
    private 气候 x;
}
企鹅关联(知道)气候

3 普通简单工厂

3.1 UML图

普通简单工厂

3.2 git

git
    https://github.com/3748/java.git

package
    com.java.design.pattern.creation.factory.simple.multiple.methods

3.3 代码

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

/**
 * 运算父类
 *
 * @author gp6
 * @date 2019/12/10
 */
@Setter
@Getter
public class FactoryOperation implements Serializable {

    private static final long serialVersionUID = 1025552182336091475L;

    /**
     * 获取结果
     *
     * @return 结果
     */
    public String getResult() {
        return "我是父类";
    }
}

/**
 * 加法运算
 *
 * @author gp6
 * @date 2019/12/10
 */
public class FactoryOperationAdd extends FactoryOperation {

    private static final long serialVersionUID = 3069555143330440903L;

    @Override
    public String getResult() {
        return "我是加法";
    }
}

/**
 * 减法运算
 *
 * @author gp6
 * @date 2019/12/10
 */
public class FactoryOperationSub extends FactoryOperation {

    private static final long serialVersionUID = -1565237675930634070L;

    @Override
    public String getResult() {
        return "我是减法";
    }
}

/**
* 操作符枚举
*
* @author gp6
* @date 2019/12/16
*/
public enum OperateEnum {
    ADD("+"),
    SUB("-"),
    MUL("*"),
    DIV("/");

    private String operate;

    OperateEnum(String operate) {
        this.operate = operate;
    }

    public String getOperate() {
        return operate;
    }


    /**
     * 匹配操作符
     *
     * @param operate 操作符
     * @return 相关枚举
     */
    public static OperateEnum matchOperate(String operate) {
        for (OperateEnum operateEnum : OperateEnum.values()) {
            if (operateEnum.getOperate().equalsIgnoreCase(operate)) {
                return operateEnum;
            }
        }
        return OperateEnum.ADD;
    }

}

/**
 * 运算工厂
 *
 * @author gp6
 * @date 2019/12/10
 */
public class OperationSimpleOrdinaryFactory {

    /**
     * 创建运算类
     *
     * @param operate 操作符
     * @return 运算类
     */
    public FactoryOperation createOperation(String operate) {
        FactoryOperation operation;
        OperateEnum operateEnum = OperateEnum.matchOperate(operate);
        switch (operateEnum) {
            case ADD:
                operation = new FactoryOperationAdd();
                break;
            case SUB:
                operation = new FactoryOperationSub();
                break;
            default:
                operation = new FactoryOperationMul();
        }
        return operation;
    }
}

/**
 * 普通简单工厂测试
 *
 * @author gp6
 * @date 2019/12/10
 */
public class TestOrdinarySimpleFactory {
    public static void main(String[] args) {
        // 加法
        FactoryOperation operationAdd = new OperationSimpleOrdinaryFactory().createOperation("+");
        System.out.println(operationAdd.getResult());

        // 减法
        FactoryOperation operationSub = new OperationSimpleOrdinaryFactory().createOperation("-");
        System.out.println(operationSub.getResult());

    }
}

4 多方法简单工厂

4.1 git

git
    https://github.com/3748/java.git

package
    com.java.design.pattern.creation.factory.simple.multiple.methods

4.2 代码

/**
 * 运算工厂
 *
 * @author gp6
 * @date 2019/12/10
 */
public class OperationSimpleMethodsFactory {

    /**
     * 创建加法对象
     *
     * @return 运算父类
     */
    public FactoryOperation createAdd() {
        return new FactoryOperationAdd();
    }

    /**
     * 创建减法对象
     *
     * @return 运算父类
     */
    public FactoryOperation createSub() {
        return new FactoryOperationSub();
    }
}

/**
 * 多方法简单工厂测试
 *
 * @author gp6
 * @date 2019/12/10
 */
public class TestMethodsSimpleFactory {
    public static void main(String[] args) {
        // 加法运算
        FactoryOperation operationAdd = new OperationSimpleMethodsFactory().createAdd();
        System.out.println(operationAdd.getResult());

        // 减法运算
        FactoryOperation operationSub = new OperationSimpleMethodsFactory().createSub();
        System.out.println(operationSub.getResult());
    }
}

5 静态方法简单工厂

5.1 git

git
    https://github.com/3748/java.git

package
    com.java.design.pattern.creation.factory.simple.statics

5.2 代码

/**
 * 运算工厂
 *
 * @author gp6
 * @date 2019/12/10
 */
public class OperationSimpleStaticFactory {

    /**
     * 创建加法对象
     *
     * @return 运算父类
     */
    public static FactoryOperation createAdd() {
        return new FactoryOperationAdd();
    }

    /**
     * 创建减法对象
     *
     * @return 运算父类
     */
    public static FactoryOperation createSub() {
        return new FactoryOperationSub();
    }
}

/**
 * 静态方法简单工厂测试
 *
 * @author gp6
 * @date 2019/12/10
 */
public class TestMethodsSimpleFactory {
    public static void main(String[] args) {
        // 加法运算
        FactoryOperation operationAdd = OperationSimpleStaticFactory.createAdd();
        System.out.println(operationAdd.getResult());

        // 减法运算
        FactoryOperation operationSub = OperationSimpleStaticFactory.createSub();
        System.out.println(operationSub.getResult());
    }
}

6 静态方法与普通简单工厂结合(通常使用)

6.1 git

git
    https://github.com/3748/java.git

package
    com.java.design.pattern.creation.factory.simple.used

6.2 代码

/**
 * 运算工厂
 *
 * @author gp6
 * @date 2019/12/10
 */
public class OperationSimpleUsedFactory {

    /**
     * 创建运算类
     *
     * @param operate 操作符
     * @return 运算类
     */
    public static FactoryOperation createOperation(String operate) {
        FactoryOperation operation;
        OperateEnum operateEnum = OperateEnum.matchOperate(operate);
        switch (operateEnum) {
            case ADD:
                operation = new FactoryOperationAdd();
                break;
            case SUB:
                operation = new FactoryOperationSub();
                break;
            default:
                operation = new FactoryOperationMul();
        }
        return operation;
    }
}

/**
 * 普通简单工厂测试
 *
 * @author gp6
 * @date 2019/12/10
 */
public class TestUsedSimpleFactory {
    public static void main(String[] args) {
        String operate = "+";
        // 根据字符串获取相应的运算类
        FactoryOperation operation = OperationSimpleUsedFactory.createOperation(operate);
        System.out.println(operation.getResult());
    }
}
上一篇 下一篇

猜你喜欢

热点阅读