设计模式入门:工厂方法模式

作者: ef6f9c30080a | 来源:发表于2019-08-03 11:19 被阅读63次

    UML类图

    工厂方法模式

    代码示例

    • 定义运算枚举
    /**
     * 运算枚举
     */
    public enum TypeEnum {
    
        /**
         * 加
         */
        ADD,
    
        /**
         * 减
         */
        SUB,;
    
    }
    
    • 定义抽象产品类,包含一个抽象方法
    /**
     * 抽象产品(计算器)
     */
    public interface ICalculator {
    
        /**
         * 计算numberA和numberB并返回操作结果
         *
         * @param numberA
         * @param numberB
         * @return 操作结果
         */
        int compute(int numberA, int numberB);
    
    }
    
    • 产品A,继承了抽象产品类并实现其定义的方法
    /**
     * 具有加法运算功能的计算器
     */
    public class CalculatorAdd implements ICalculator {
    
        /**
         * 将两个数进行加法运算
         *
         * @param numberA
         * @param numberB
         * @return 相加结果
         */
        @Override
        public int compute(int numberA, int numberB) {
            return numberA + numberB;
        }
    
    }
    
    • 产品B,继承了抽象产品类并实现其定义的方法
    /**
     * 具有减法运算功能的计算器
     */
    public class CalculatorSub implements ICalculator {
    
        /**
         * 将两个数进行减法运算
         *
         * @param numberA
         * @param numberB
         * @return 相减结果
         */
        @Override
        public int compute(int numberA, int numberB) {
            return numberA - numberB;
        }
    
    }
    
    • 抽象工厂,用于获取相应的产品
    public interface ICalculatorFactory {
    
        /**
         * 获取生产某一功能的计算器工厂实例
         *
         * @return 返回生产某一功能计算器的工厂实例
         */
        ICalculator productCalculator();
    
    }
    
    • 具体工厂A,实现了获取相关产品的功能
    public class CalculatorAddFactory implements ICalculatorFactory {
    
        /**
         * 获取具有加法运算功能的计算器实例
         *
         * @return 返回当前实例
         */
        @Override
        public ICalculator productCalculator() {
            return new CalculatorAdd();
        }
    
    }
    
    • 具体工厂B,实现了获取相关产品的功能
    public class CalculatorSubFactory implements ICalculatorFactory {
    
        /**
         * 获取具有减法运算功能的计算器实例
         *
         * @return 返回当前实例
         */
        @Override
        public ICalculator productCalculator() {
            return new CalculatorSub();
        }
    
    }
    
    • 客户端测试
    public class CalculatorMain {
    
        public static void main(String[] args) {
            int numberA = 23;
            int numberB = 18;
    
            // 从抽象工厂获取生产某一功能计算器的工厂实例
            ICalculatorFactory calculatorFactory = new CalculatorSubFactory();
            // 从当前工厂获取制造某一功能的计算器实例
            ICalculator calculator = calculatorFactory.productCalculator();
            int result = calculator.compute(numberA, numberB);
            System.out.println("result = " + result);
        }
    
    }
    

    总结思考

      工厂方法同样也是一种创建型模式,是简单工厂模式的进一步抽象和推广。根据开闭原则,在工厂方法模式中新增功能,需要添加相应的功能类和工厂类(对扩展开放,对修改关闭),而具体的实例化则延迟到了工厂子类,并由客户端决定实例化哪一个工厂类。

      对比简单工厂,工厂方法把简单工厂内部的逻辑判断移动到了客户端,当添加功能时,原本是要改工厂类的,而现在是修改客户端。

    示例代码

    相关文章

      网友评论

        本文标题:设计模式入门:工厂方法模式

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