静态工厂对比构造器之优缺点

静态方法介绍

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

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

静态方法应用举例

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

缺点

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

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

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

时间: 2024-10-12 15:44:22

静态工厂对比构造器之优缺点的相关文章

经验法则:考虑用静态工厂方法代替公有构造方法

经验法则:考虑用静态工厂方法代替公有构造方法 一.引出静态工厂方法 对于java类而言,为了让使用者获取它自身的一个实例化对象,会有以下方法: 1.该类提供一个公有的构造方法.在这种情况下,程序可以通过多个“new 构造方法”语句来创建类的任意多个实例.但是每执行一条new语句,都会导致java虚拟机的堆区中产生一个新的对象. 2.该类提供一个公有的静态工厂方法(它只是一个简单的静态方法,返回的是类的一个实例,要区别于设计模式中的工厂方法模式).对于某些java平台库类或自己的工具类.参数化类,

Spring 使用静态工厂方式实例化Bean

知识点介绍: 静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取. [转载使用,请注明出处:http://blog.csdn.net/mahoking] 操作步骤: 1.创建Speaker对象. /** * 静态工厂类 * */ public class Speaker { private String name ; private String t

[Effective Java]考虑用静态工厂方法代替构造器

本文主要介绍如何使用静态工厂方法已经在那种场合来使用这种方式代替构造方法. 众所周知,对于类而言,我们为了获得一个类的实例对象,通常情况下会提供一个公有的(public) 的构造器.当然除了这种方法以外,我们还可以通过给类提供一个public的静态工厂方法(static factory method)的方式来完成,让它返回一个类的实例. 先看一个简单的Boolean的示例,这个示例将boolean基本类型值转换成一个Boolean对象的引用. public static Boolean valu

第一条:考虑用静态工厂代替构造器

对于类而言,为了让使用者获取它自身的一个实例,最常见的方法就是提供一个公有的构造器.但是有一种方法,他就是静态工厂方法(static factory method),它只返回类的实例的静态方法.比如说我们所有的基本类型的封装类中的valueOf()方法 1 public static Boolean valueOf(boolean b){ 2 3 return b ? Boolean.TRUE : Boolean.FALSE; 4 5 } 类可以通过静态的工厂方法提供它的客户端,而不是通过构造器

<创建和销毁对象>经验法则——考虑用静态工厂方法代替公有构造方法

一.引出静态工厂方法 对于java类而言,为了让使用者获取它自身的一个实例化对象,会有以下方法: 1.该类提供一个公有的构造方法.在这种情况下,程序可以通过多个“new 构造方法”语句来创建类的任意多个实例.但是每执行一条new语句,都会导致java虚拟机的堆区中产生一个新的对象. 2.该类提供一个公有的静态工厂方法(它只是一个简单的静态方法,返回的是类的一个实例,要区别于设计模式中的工厂方法模式).对于某些java平台库类或自己的工具类.参数化类,需要进一步封装创建自身实例的细节,并且控制自身

Efflective Java读书笔记 第一条 考虑用静态工厂方法代替构造器

创建一个类的实例的方法,最常用的是提供一个公有[public]的构造器,另外还有一种方法是类可以提供一个公有的静态工厂方法. 静态工厂方法对于构造器有着不同的优势和劣势. 优势: 1.静态工厂方法可定义更有意思的名称,而构造函数只能是类名. eg:BigInteger的构造函数返回的可能是素数,不过使用BigInteger.probablePrime更加明确. 2.静态工厂方法不必没有调用的时候都创建一个新的对象,这对于不可变类可以预先构造好实例,调用时静态工厂方法直接返回即可. eg:Bool

Effective Java 读书笔记(一):使用静态工厂方法代替构造器

这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文<java中final与static的使用场景总结>. 什么是静态工厂方法? 可以参考书中的例子(摘自JDK1.7 java.lang.Boolean) public final class Boolean implements java.io.Serializable, Comparable<

EffectiveJava读书笔记——考虑用静态工厂方法代替构造器(一)

参考网址:http://blog.csdn.net/mingyunduoshou/article/details/6149758 http://blog.163.com/[email protected]/blog/static/10182372420133220511247/ 静态工厂方法讲解 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实

Think in Java 静态工厂方法学习总结

静态工厂方法是一个返回类实例的静态方法.静态工厂方法的用于替代构造方法. 1.静态工厂方法的优点 如果一个构造方法的参数没有具体描述要返回的对象,那么使用一定意义名字的静态工厂方法使得该类更利于使用. 如果一个类有多个特征相同的构造方法,那么应该考虑用有特殊意义名字的静态工厂方法来代替构造方法. 静态工厂方法在调用的时候不要求一定要有类对象.对于一个非可变类,可以使用一个预先构造好的实例,或者实例已经缓存起来,避免创建重复对象. 静态工厂方法可以为重复的调用返回同一个对象.第一他可以使一个类确保