设计模式

工厂模式

2020-03-08  本文已影响0人  GeekerLou

工厂模式

问题:

分类

三种工厂模式对比

简单工厂模式的优缺点

优点:

  1. 屏蔽产品的具体实现,调用者只关心产品的接口。
  2. 实现简单

缺点:

  1. 增加产品,需要修改工厂类,不符合开放-封闭原则
  2. 工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则

工厂方法模式的优缺点

优点:

  1. 继承了简单工厂模式的优点
  2. 符合开放-封闭原则

缺点:

  1. 增加产品,需要增加新的工厂类,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。

抽象工厂模式的优缺点

优点:

  1. 隔离了具体类的生成,使得客户并不需要知道什么被创建
  2. 每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便;

缺点

  1. 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。

精华总结(记忆)

最后,三种工厂模式各有优缺点,没有最好的,只有最合适的!

示例

公共类

Operation.java

public abstract class Operation {
    private double value1 = 0;
    private double value2 = 0;

    public double getValue1() {
        return value1;
    }
    public void setValue1(double value1) {
        this.value1 = value1;
    }
    public double getValue2() {
        return value2;
    }
    public void setValue2(double value2) {
        this.value2 = value2;
    }

    public abstract Double calculateResult();

}

OperationAdd.java

public class OperationAdd extends Operation {

    @Override
    public Double calculateResult() {
        return getValue1() + getValue2();
    }
}

OperationDiv.java

public class OperationDiv extends Operation {

    @Override
    public Double calculateResult() {
        if (getValue2() != 0) {
            return getValue1() / getValue2();
        } else {
            return null;
        }
    }
}

OperationMul.java

public class OperationMul extends Operation {

    @Override
    public Double calculateResult() {
        return getValue1() * getValue2();
    }
}

OperationSub.java

public class OperationSub extends Operation {
    @Override
    public Double calculateResult() {
        return getValue1() - getValue2();
    }
}

简单工厂模式示例

/**
 * 操作方法的工厂类
 *
 * 含有一定的商业逻辑和判断逻辑,例如switch...case...分支判断。在java中它往往由一个具体类实现
 */
public class OperationFactory {
    public static Operation createOperation(String operation) {
        Operation oper = null;
        switch (operation) {
            case "+":
                oper = new OperationAdd();
                break;
            case "-":
                oper = new OperationSub();
                break;
            case "*":
                oper = new OperationMul();
                break;
            case "/":
                oper = new OperationDiv();
                break;
            default:
                throw new UnsupportedOperationException("不支持该操作");
        }
        return oper;
    }
}

工厂方法模式示例

/**
 * 工厂接口
 */
public interface IFactory {
    Operation CreateOperation();
}
/**
 * 加法类工厂
 */
public class AddFactory implements IFactory {
    @Override
    public Operation CreateOperation() {
        return new OperationAdd();
    }
}
/**
 * 减法工厂类
 */
public class SubFactory implements IFactory {
    @Override
    public Operation CreateOperation() {
        return new OperationSub();
    }
}
/**
 * 乘法工厂类
 */
public class MulFactory implements IFactory {
    @Override
    public Operation CreateOperation() {
        return new OperationMul();
    }
}

/**
 * 除法工厂类
 */
public class DivFactory implements IFactory {
    @Override
    public Operation CreateOperation() {
        return new OperationDiv();
    }
}

抽象工厂模式示例

(TODO)

参考资料

  1. 你以为工厂模式很简单,可能是因为你懂的只是冰山的一角
  2. 代码仓库
上一篇下一篇

猜你喜欢

热点阅读