effective心得(一) 静态工厂方法

来源:互联网 发布:java开发mes系统 编辑:程序博客网 时间:2024/04/27 19:45

静态工厂方法讲解:

     创建类的实例最常见的就是new语句来调用类的构造方法。在这种情况下,程序可以创建类的任意多个实例,每执行一个new语句,都会导致java虚拟机的堆区产生一个java对象。假如类需要进一步封装创建自身实例的细节,并且控制自身实例的数目,那么就可以考虑静态工厂方法。

      静态工厂方法与new语句调用的构造方法相比,有以下区别:

(1):静态工厂的方法名可以任意的,这一特性的优点是可以提高代码的可读性,在方法名中能体现与实例有关的信息。

例如Gender类有两个静态工厂方法:getFemale()和getMale()。

Gender.java
public class Gender{
   private String description;
   private static final Gender female=new Gender("女");
   private static final Gender male=new Gender("男");
   private Gender(String description){this.description=description;}
   public static Gender getFemale(){
     return female;
   }
   public static Gender getMale(){
      return male;
   }
   public String getDescription(){return description;}
}

  这一特性的缺点是与其他的静态方法没有明显的区别,使用户难以识别类中到底哪些静态方法专门负责返回类的实例。为了减少这一缺点带来的负面影响,可以在为静态工厂方法命名时尽量遵守约定俗成的规范,当然这不是必需的。目前比较流行的规范是把静态工厂方法命名为valueOf或者getInstance。

    静态工厂方法最主要的特点是:每次被调用的时候,不一定要创建一个新的对象。利用这一特点,静态工厂方法可用来创建以下类的实例。

        单例类:只有惟一的实例的类。

        枚举类:实例的数量有限的类。

        具有实例缓存的类:能把已经创建的实例暂且存放在缓存中的类。

        具有实例缓存的不可变类:不可变类的实例一旦创建,其属性值就不会被改变。

但静态工厂方法又有缺点:

1. 类如果不含公有的或者default的,就不能被子类化

 2.他们跟其它的静态方法实际上没有任何区别。但这可以尽量采用一些家喻户晓的名字解决,让用户看到改名字就知道该方法是静态工厂方法。如getInstance()。


0 0