`
chenguanwei2008
  • 浏览: 119070 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

静态工厂方法

阅读更多

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

        例如Class实例是Java虚拟机在加载一个类时自动创建的,程序无法用new语句创建java.lang.Class类的实例,因为Class类没有提供public类型的构造方法。为了使程序能获得代表某个类的Class实例,在Class类中提供了静态工厂方法forName(String name),它的使用方式如下:

        Class c=Class.forName("Sample"); //返回代表Sample类的实例

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

        (1)构造方法的名字必须与类名相同。这一特性的优点是符合Java语言的规范,缺点是类的所有重载的构造方法的名字都相同,不能从名字上区分每个重载方法,容易引起混淆。静态工厂方法的方法名可以是任意的,这一特性的优点是可以提高程序代码的可读性,在方法名中能体现与实例有关的信息。例如Gender类有两个静态工厂方法:getFemale()和getMale()。

Gender.java

  1. public class Gender{
  2.    private String description;
  3.    private static final Gender female=new Gender("女");
  4.    private static final Gender male=new Gender("男");
  5.    private Gender(String description){this.description=description;}
  6.    public static Gender getFemale(){
  7.       return female;
  8.    }
  9.    public static Gender getMale(){
  10.       return male;
  11.    }
  12.    public String getDescription(){return description;}
  13.   }

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

   valueOf:该方法返回的实例与它的参数具有同样的值,例如:

   Integer a=Integer.valueOf(100); //返回取值为100的Integer对象

   从上面代码可以看出,valueOf()方法能执行类型转换操作,在本例中,把int类型的基本数据转换为Integer对象。

   getInstance:返回的实例与参数匹配,例如:

   //返回符合中国标准的日历

   Calendar cal=Calendar.getInstance(Locale.CHINA);

   (2)每次执行new语句时,都会创建一个新的对象。而静态工厂方法每次被调用的时候,是否会创建一个新的对象完全取决于方法的实现。

   (3)new语句只能创建当前类的实例,而静态工厂方法可以返回当前类的子类的实例,这一特性可以在创建松耦合的系统接口时发挥作用。

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

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

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

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

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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics