• 工厂方法模式


    前言:这两天学习了简单工厂模式、工厂方法模式、抽象工厂模式,在这里详细说一下工厂方法模式。转载请注明出处:

    工厂方法模式

    定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

      工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

    使用的设计原则:依赖倒置原则(要依赖抽象,不要依赖具体类)。对修改关闭,对扩展开放。

    类图:

    总结:

      1、工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

      2、工厂方法,可以接受传参(称为“参数化工厂方法”),根据传入的参数不同创建不同的对象。也可以不接受传参,只产生一种对象,不需要参数化。

      3、利用字符串传参,有点危险,万一拼错,可能会造成所谓的“运行时错误”,所以避免方式为在编译时期就将参数的错误挑出来。比如:可以创建代表参数类型的对象、使用常量、枚举 enum。

    缺点:

      1、由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。

    举例说明:

      要求:使用面向对象实现一个计算器控制台程序,要求输入两个数字和运算符号,得到结果。

      重点:使用面向对象思想。

      使用工厂方法模式实现:

    类图:

     抽象运算类

    /**
     * 运算抽象类
     */
    abstract class Operation{
        private int num1;
        private int num2;
    
        public int getNum1() {
            return num1;
        }
    
        public void setNum1(int num1) {
            this.num1 = num1;
        }
    
        public int getNum2() {
            return num2;
        }
    
        public void setNum2(int num2) {
            this.num2 = num2;
        }
    
        public abstract double getResult();
    }

     具体运算类

    /**
     * 加法运算
     */
    class AddOperation extends Operation{
        @Override
        public double getResult() {
            return getNum1() + getNum2();
        }
    }
    
    /**
     * 减法运算
     */
    class SubOperation extends Operation{
        @Override
        public double getResult() {
            return getNum1() - getNum2();
        }
    }
    
    /**
     * 除法运算
     */
    class DivOperation extends Operation{
        @Override
        public double getResult() {
            return getNum1() / getNum2();
        }
    }
    
    /**
     * 乘法运算
     */
    class MulOperation extends Operation{
        @Override
        public double getResult() {
            return getNum1() * getNum2();
        }
    }

     抽象工厂类

    /**
     * 抽象工厂类
     */
    interface IFactory{
        Operation CreateOperation();
    }

    具体工厂类

    /**
     * 加法工厂类
     */
    class AddFactory implements IFactory{
    
        @Override
        public Operation CreateOperation() {
            return new AddOperation();
        }
    }
    
    /**
     * 减法工厂类
     */
    class SubFactory implements IFactory{
    
        @Override
        public Operation CreateOperation() {
            return new SubOperation();
        }
    }
    
    /**
     * 除法工厂类
     */
    class DivFactory implements IFactory{
    
        @Override
        public Operation CreateOperation() {
            return new DivOperation();
        }
    }
    
    /**
     * 乘法工厂类
     */
    class MulFactory implements IFactory{
    
        @Override
        public Operation CreateOperation() {
            return new MulOperation();
        }
    }

    客户端

        public static void main(String[] args){
            IFactory factory = new AddFactory();
            Operation operation = factory.CreateOperation();
            operation.setNum1(1);
            operation.setNum2(2);
            System.out.println(operation.getResult());
        }

    其他工厂模式https://www.cnblogs.com/yuxiaole/p/9276396.html

    转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9280695.html

    参考书籍:《Head First 设计模式》《大话设计模式》

  • 相关阅读:
    .net实现支付宝在线支付
    彻头彻尾理解单例模式与多线程
    Linq中的Select与Select many
    MVC中子页面如何引用模板页中的jquery脚本
    浅谈MemCahe
    左连接,右连接,内连接(left join ,right join,inner join)
    协变与逆变
    子类对父类中的属性和字段的改写
    里氏转换
    MVC基础篇—控制器与视图数据的传递
  • 原文地址:https://www.cnblogs.com/yuxiaole/p/9281281.html
Copyright © 2020-2023  润新知