工厂模式

作者: GeekerLou | 来源:发表于2020-03-08 11:14 被阅读0次

    工厂模式

    问题:

    • 工厂模式分为几类?
    • GOF 23种设计模式中,工厂方法模式和抽象工厂模式有什么区别?
    • 不在GOF 23种设计模式中的简单工厂模式是什么?
    • 简单工厂模式、工厂方法模式和抽象工厂模式各自解决什么问题?有什么不同?

    分类

    • 简单工厂
    • 工厂方法
    • 抽象工厂

    三种工厂模式对比

    简单工厂模式的优缺点

    优点:

    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. 代码仓库

    相关文章

      网友评论

        本文标题:工厂模式

        本文链接:https://www.haomeiwen.com/subject/lchddhtx.html