zoukankan      html  css  js  c++  java
  • 静态工厂对比构造器之优缺点

    静态方法介绍

      对于一个类,拿到它自身的一个实例,我们通常是调用公有的构造器,但是还有一种方法-静态工厂方法,在某些情况下可以更加方便返回类的实例。

      静态工厂-返回类的一个实例的静态方法。

    静态方法应用举例

      在Boolean这个类中,有个valueOf方法,我们来看看它的源代码:

        public static Boolean valueOf(boolean b) {
            return (b ? TRUE : FALSE);
        }

      查看一个TRUE和FALSE在Boolean中的定义

        public static final Boolean TRUE = new Boolean(true);
        public static final Boolean FALSE = new Boolean(false);

      我们从上面可以看出:

    1. valueOf方法是static的,是静态的
    2. valuof方法返回的是Boolean的一个已经实例化好的实例,而且这个实例是可以重复利用的

    优势

      优点一:构造器方法名写死,静态工厂方法可以改名称,让人顾名思义

        类的构造方法是写死的,例如类User的构造方法名只能为User,如果是使用静态工厂方法,名称为createUser,这样人家一看就知道这样方法是干什么用的了。

      优点二:静态工厂方法可以做到每次调用的时候都不必创建一个对象

        在静态方法中,我们可以预先创建一个对象,每次返回一个该对象,就不用创建了,前提是调用者使用同一个对象不会出现问题

    /**
     * User类
     * @author xujianguo
     *
     */
    public class User {
        /**
         * 创建静态不可变的对象
         */
        private static final User user = new User();
        
        /**
         * 静态工厂方法
         * 返回唯一的实例
         * @return
         */
        public static User newInstance() {
            return user;
        }
    }

      优点三:静态工厂方法可以返回原返回类型的任何子类的对象

        构造方法只能返回该类的对象,而静态工厂方法可以利用多态,返回该类的子类的对象。

    /**
     * Father类
     * @author xujianguo
     */
    class Father {
        /**
         * 构造方法
         */
        public Father() {}
        
        /**
         * say方法
         */
        public void say() {
            System.out.println("Father say");
        }
        
        /**
         * 静态工厂方法
         * 根据index来返回对象,可以返回该类的子类的对象
         * @param index
         * @return
         */
        public static Father newInstance(int index) {
            switch(index) {
            case 1:
                return new Son1();
            case 2:
                return new Son2();
            default:
                return new Father();
            }
        } 
    }
    
    /**
     * Son1类
     * 继承Father
     * @author xujianguo
     */
    class Son1 extends Father {
        public void say() {
            System.out.println("Son1 say");
        }
    }
    
    /**
     * Son2类
     * 继承Father
     * @author 
     */
    class Son2 extends Father {
        public void say() {
            System.out.println("Son2 say");
        }
    }

    缺点

      缺点一:静态工厂方法与其他静态方法没有什么区别

        静态工厂方法的作用是跟构造方法一样的,但是却在定义上跟其他静态方法没有区别,这样开发者很难在一堆静态方法中找到静态工厂方法来创建对象。

      缺点二:若类没有提供公有的构造方法,就不能自己写静态方法去创建对象

  • 相关阅读:
    JS是单线程的吗?
    JQuery $ $.extend(),$.fn和$.fn.extend javaScript对象、DOM对象和jQuery对象及转换 工具方法(utility)
    JavaScript 操作符 变量
    WEB组件 开发 (未完成 413)
    CSS传统布局之布局模型
    JavaScript 作用域 匿名函数 模仿块级作用域(私有作用域)
    JQuery常用API 核心 效果 JQueryHTML 遍历 Event事件
    JavaScript 属性类型(数据属性 访问器属性)
    CSS居中问题:块级元素和行级元素在水平方向以及垂直方向的居中问题
    javascript 深入浅出 (未完成417)
  • 原文地址:https://www.cnblogs.com/rayguo/p/3771100.html
Copyright © 2011-2022 走看看