抄袭自《Effective Java ,Second Edition》

The normal way for a class to allow a client to obtain an instance of itself is to provide a public constructor. There is another technique that should be a part of every
programmer’s toolkit.

例子:Boolean类

public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}

One advantage of static factory methods is that, unlike constructors, they
have names.

A second advantage of static factory methods is that, unlike constructors,
they are not required to create a new object each time they’re invoked.

A third advantage of static factory methods is that, unlike constructors,
they can return an object of any subtype of their return type.

引用别人文章的一些东西

以下静态工厂方法的优势摘自http://blog.csdn.net/dm_vincent/article/details/8513720

静态工厂方法的优势

当然,这里所说的优势,通常都是和传统构造函数相比得到的。

静态工厂方法拥有名字

静态工厂方法拥有自己的名字,而构造函数则没有。这也就意味着,同一组参数列表,只能有唯一的一个构造函数(通过改变参数列表中参数的顺序,可以有多个构造函数,但是很明显,这不是一个好主意)。相比之下,静态工厂方法则没有这个限制,对同一组参数,可以有任意多的静态工厂方法。因此,这种情况下使用静态工厂方法来进行对象实例化更加灵活,可读性也更好。

对于对象实例化的更多控制

对于构造函数而言,一旦它被调用,那么就肯定会生成一个新的实例。而调用静态工厂方法则不一定,它只需要返回一个对象的实例就够了,至于这个返回的对象是如何得到的,它并不关注。因此,静态工厂方法对于对象的实例化就有了更多的控制权。它能够利用预先创建好的不可变对象(Immutable Instance),也能够从缓存中获取某个经常被请求的对象。从而大幅度的提高性能。

英文原文可参照

This
allows immutable classes (Item 15) to use preconstructed instances, or to cache
instances as they’re constructed, and dispense them repeatedly to avoid creating
unnecessary duplicate objects. The Boolean.valueOf(boolean)method illustrates this technique: it never creates an object. This technique is similar to the
Flyweightpattern [Gamma95, p. 195]. It can greatly improve performance if
equivalent objects are requested often, especially if they are expensive to create.

返回对象的类型更加泛化

对于构造函数而言,它只能返回当前类的实例。而静态工厂方法的实际返回类型可以是声明返回类型的任何子类型。比如,声明返回Base类型的静态工厂方法,实际上它能够返回Sub类型,只要Sub是Base的子类型。因为子类型的概念不仅限于继承层次,还可以适用在接口和其实现类之间,因此这种泛化的关系也非常契合“面向接口编程”这一指导原则。

转载于:https://my.oschina.net/liangzhenghui/blog/178187

Consider static factory methods instead of constructor相关推荐

  1. Effective Java - Item 1: Consider static factory methods instead of constructors

    考虑使用静态工厂方法来替代构造方法, 这样的做的好处有四点. 1. 更好的表意 有的构造方法实际上有特殊的含义, 使用静态工厂方法能更好的表达出他的意思. 例如 BigInteger(int, int ...

  2. Factory Methods

    摘要Abstract:本文主要是对<API Design for C++>中Factory Methods章节的翻译,若有不当之处,欢迎指正. 关键字Key Words:C++.Facto ...

  3. Static interface methods are only supported starting with Android N (--min-api 24): void okhttp3.log

    错误内容如下 Error: Static interface methods are only supported starting with Android N (--min-api 24): vo ...

  4. php 工厂静态类,静态工厂模式(Static Factory)

    1.9.1. 目的 与抽象工厂模式类似,此模式用于创建一系列相关或相互依赖的对象. 『静态工厂模式』与『抽象工厂模式』的区别在于,只使用一个静态方法来创建所有类型对象, 此方法通常被命名为 facto ...

  5. C++ 设计模式之Static Factory模式(简单工厂模式)

    简单工厂模式并不是GOF提出的23种设计模式中的一种.工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品. 适用场合 1.在程序中,需要创建的对象很多,导致对象的 ...

  6. 精简jdk包_具有JDK 12精简数字格式的自定义精简数字模式

    精简jdk包 帖子" 紧凑数字格式出现在JDK 12中 "已经成为有关Java subreddit线程的讨论主题 . 在那个线程中表达的与紧凑数字格式表示有关的问题涉及显示的精度数 ...

  7. 具有JDK 12精简数字格式的自定义精简数字模式

    帖子" 紧凑数字格式到JDK 12 "已经成为java subreddit线程上讨论的主题 . 在那个线程中表达的与紧凑数字格式表示有关的问题涉及显示的精度数字和显示的紧凑数字模式 ...

  8. 【Effective Java】第二章:静态工厂、构建器、强化Singleton属性、私有构造器、

    文章目录 一. 用静态工厂方法代替构造器 优势: 劣势: 实例代码: 二. 遇到多个构造器参数时要考虑使用构建器 ① 重叠构建器 ② JavaBeans模式 ③ Builder模式 三. 用私有构造器 ...

  9. SpringMVC那点事

    一.SpringMVC返回json数据的三种方式 1.第一种方式是spring2时代的产物,也就是每个json视图controller配置一个Jsoniew. 如:<bean id=" ...

最新文章

  1. 2021年大数据Hadoop(二十二):MapReduce的自定义分组
  2. Debian 6 7 8 utc时间设置
  3. php 插入2个数组,用PHP将2个数组插入mysql
  4. To B服务想做移动化?腾讯云案例了解一下
  5. HDU2020 绝对值排序
  6. 产品经理经验谈50篇(二):如何写好一份规范的数据分析报告?我想你需要知道这些
  7. EPSON 利用CCD图像处理包标定工具坐标系
  8. DataReader不奇怪,该出手时就出手!
  9. html页面怎么引用通用的头部,html 如何引入一个公共的头部和底部
  10. 【Selenium-WebDriver自学】出现的问题和解决方案(十七)
  11. 学习了《神经网络模型及其matlab仿真程序设计》总结思考
  12. 网页传奇服务器端,拍拍科技武易传奇神鸟归来商业版+网站
  13. java中的移位操作
  14. 海康流媒体客户端开发
  15. Android GPS应用开发
  16. 建造者模式(二):游戏角色设计的建造者模式解决方案
  17. 《奋斗》中的经典台词
  18. pyepics Device:PVs的集合
  19. “菩提本无树,明镜亦非台,本来无一物,何处惹尘埃”的典故
  20. 自动识别图片验证码登录

热门文章

  1. NYOJ 215 Sum
  2. pycharm解决Inconsistent indentation:mix of tabs and spaces
  3. centos 6 防火墙开启端口无效问题
  4. CSS3属性之text-overflow:ellipsis,指定多行文本中任意一行显示...
  5. 算法编程题的心得体会
  6. android Studio 运行不显示avd 无法运行
  7. nginx upstream setting
  8. nyoj--891--找点(贪心)
  9. linux java so 历险
  10. mootools脚本框架下载