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");
        }
    }

    缺点

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

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

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

  • 相关阅读:
    操作系统:DOS
    袁氏-人物:袁淑
    移植linux-2.6.32.2到qq2440
    qq2440启动linux后出现错误提示request_module: runaway loop modprobe binfmt-464c
    qq2440启动linux后插入u盘出现usb 1-1: device descriptor read/64, error -110,usb 1-1: device not accepting address 8, error -110
    ubuntu14.04 64bit安装teamviewer
    vi 的使用
    添加了环境变量,然而交叉编译器还是无法运行的解决方案
    linux下route命令使用实战
    ubuntu14.04纯命令行下连接有线网和无线网
  • 原文地址:https://www.cnblogs.com/rayguo/p/3771100.html
Copyright © 2011-2022 走看看