zoukankan      html  css  js  c++  java
  • [设计模式]简单工厂模式

    写在前面的话:

            一个类或对象中往往会包含别的对象。在创建这种成员对象时,你可能习惯使用常规的方法,即用new关键字和构造函数创建实例。但这样问题在于会导致两个类之间产生依赖性。消除这两个类之间的依赖模式,可以使用一种方法来决定究竟要实现哪个具体类。

    用简单工厂模式实现计算器

    UML类图:

    代码中使用的工具类

    var Util = {
        /* subClass继承superClass */
        extend: function(subClass, superClass) {
            var F = function() {};
            F.prototype = superClass.prototype;
            subClass.prototype = new F();           //为子类设置原型对象
            subClass.prototype.constructor = subClass;
            
            subClass.superclass = superClass.prototype;
            if(superClass.prototype.constructor === Object.prototype.constructor) {
                superClass.prototype.constructor = superClass;
            }
        }
    };

    简单工厂使用一个类(通常是一个单体)来生成实例。

    //用单例实现获取运算符的实例
    var OperationFactory = {
        //根据传递的参数创建相应的运算符对象并返回
        createOperation: function(operate) {
            var oper = null;
            switch(operate) {
                case '+':
                    oper = new OperationAdd();
                    break;
                //...
            }
            return oper;
        }
    };

    业务的封装

    Operation运算类

    //超类:运算类
    function Operation() {
        //私有属性 参与运算的数字
        var number1, number2;
        
        //公有方法 属性的取值器和赋值器
        this.getNumber1 = function() {
            return number1;
        };
        this.setNumber1 = function(number) {
            number1 = number;
        };
        this.getNumber2 = function() {
            return number2;
        };
        this.setNumber2 = function(number) {
            number2 = number;
        };
    }
    //公有方法
    Operation.prototype = {
        //虚函数 需要子类实现
        getResult: function() {
            var result = 0.0;
            return result;
        }
    };

    各种运算符类(+ - * /)继承运算类 

    function OperationAdd() {           //+
        OperationAdd.superclass.constructor.call(this);     //实现继承第一步
    }
    Util.extend(OperationAdd, Operation);                   //实现继承第二步
    /*
     * 重写超类的方法
     * @override 
     */
    OperationAdd.prototype.getResult = function() {         //扩展子类
        var result = this.getNumber1() + this.getNumber2();
        return result;
    };   
    function OperationSub() {           //'-'
        OperationSub.superclass.constructor.call(this);
    }
    Util.extend(OperationSub, Operation);
    //重写超类的方法
    OperationSub.prototype.getResult = function() {
        //...
    }
    function OperationMul() {           //'*'
        
    }
    function OperationDiv() {           //'/'
        
    }

    程序的总体结构:

    var calculator = (function(Util){
        //超类:运算类
        function Operation() {
            //...
        }
        //公有方法
        Operation.prototype = {
            //虚函数 需要子类实现
            getResult: function() {}
        };
        //-----------------------------------------------------------------    
        //各种运算符类(+ - * /)继承运算类    
        function OperationAdd() {           //+
            OperationAdd.superclass.constructor.call(this);     //实现继承第一步
        }
        Util.extend(OperationAdd, Operation);                   //实现继承第二步
        /*
         * 重写超类的方法
         * @override 
         */
        OperationAdd.prototype.getResult = function() {         //扩展子类
            var result = this.getNumber1() + this.getNumber2();
            return result;
        };   
        function OperationSub() {           //'-'
            //...
        }
        function OperationMul() {           //'*'
            //...
        }
        function OperationDiv() {           //'/'
            //...
        }
        //------------------------------------------------------
        //用单例实现获取运算符的实例
        var OperationFactory = {
            //...
        };
        return {
             OperationFactory: OperationFactory 
        };
    })(Util);

    对加法类简单的测试:

    (function() {
        var oper = null;
        //根据传递的参数获取运算符对象
        oper = calculator.OperationFactory.createOperation('+');
        oper.setNumber1(1);
        oper.setNumber2(2);
        console.log(oper.getResult());
    })();

    编程是一门技术,更是一门艺术,应时常考虑如何让代码更加简练,更加容易维护,容易扩展和复用,只有这样才可以真正的提高编程能力。

  • 相关阅读:
    Prism_Commanding(2)
    Prism_简介(1)
    思维导图
    自学_DOM<五>
    spring cloud 微服务之 -- 配置文件拆分之道
    idea 2019破解方法(真实可用,完美破解)
    小白的springboot之路(十四)、AOP
    小白的springboot之路(十三)、过滤器、监听器、拦截器
    闲话计算机端口
    小白的springboot之路(十二)、集成log4j2日志
  • 原文地址:https://www.cnblogs.com/mackxu/p/2949989.html
Copyright © 2011-2022 走看看