【Effective Java】1.1使用静态工厂方法

一、什么是静态工厂方法

首先明确的是,此处的静态工厂方法和设计模式中的任何工厂模式都没有关系。

静态工厂方法就是一个类中的一个普通的静态方法,其特殊在于没有其它处理逻辑,仅是返回一个实例。用于代替使用构造器来创建实例。

二、怎么使用静态工厂方法

当需要提供多个构造器来构造实例时,可以考虑使用静态工厂方法。提供一个静态的方法,方法名字取得特殊一些,返回一个当前类的实例,代替调用构造器的方式。

三、使用静态工厂方法的优势

优势有如下5点:

  1. 提供更丰富的名称。构造器由于限制名称只能是类名,那么需要按照需求构造多种实例时,只能通过方法参数类型、数量、不同类型的顺序来区分构造方法,如果想要提供更加丰富的构造方法则难以区分。而静态工厂方法则方便很多,因为方法名可以按照需要任意取。
  2. 可以控制实例的创建。构造器方法在调用时都会创建一个新的实例,而如果需要控制实例的个数,比如单例模式,则需要使用静态工厂来实现。
  3. 返回灵活的实例类型。不像构造器那样每次返回一个确定类的实例。静态工厂方法可以返回任何返回值类的子类型实例,更加灵活。
  4. 根据参数返回实例。类似于上一点,返回灵活的实例类型,可以根据传入参数的不同,返回不同类的实例。
  5. 没看懂“A fifth advantage of static factories is that the class of the returned object need not exist when the class containing the method is written.”不理解什么意思

四、静态工厂方法的缺点

缺点有2点:

  1. 由于很多使用静态工厂的类会在接口中以private修饰,再通过静态工厂方法提供实例,因此这些类无法暴露出来被继承使用等。感觉这个理由说的也有些牵强。
  2. 由于不像构造器那样提供了明显的方法名,因此别人用的时候都不知道哪些是静态工厂方法,还得看文档。这也不是啥大问题吧。

五,静态工厂方法的实战

实战主要有两方面,一是静态工厂方法名怎么取?二是JDK中哪里采用了静态工厂方法。

静态工厂方法名的通常取法

  1. from
  2. of
  3. valueOf
  4. instance  getInstance
  5. create newInstance
  6. getType
  7. newType
  8. type

JDK中哪些地方采用了静态工厂方法

  1. Collections中,Collections.list、Collections.synchronizedHashMap等,还有guava提供的Lists.newArrayList等
  2. Files.newBufferedReader(Path)
  3. BigInteger.valueOf(value)
  4. Date.from(instance)

使用静态工厂的地方还是很多的,当构造一个类的实例具备上述静态工厂的优势时,就可以考虑使用静态工厂。如果只需要简单的构造器就能满足需要,例如一个无参构造器+一个有参构造器就够了,没必要用静态工厂方法替代构造器。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值