第1条:考虑用静态工厂方法代替构造器

首先清楚什么是静态工厂方法?

静态工厂方法说白了就是在创建对象的时候,不是自己使用new关键字创建的,而是使用静态方法来对外提供自身的实例的方法。

比如:

Fragment fragment=MyFragment.newIntance();

Calendae calendae=Calendae.getIntance();

Integer integer=Integer.valueOf(“3”);

New关键字代表着程序执行到这里的时候,JVM会创建一个内存空间,然后调用构造函数来初始化成员变量,最终把引用返回给调用方。

我自己的理解是:类似使用单利模式进行创建,直接调用创建对象的那个方法。

静态工厂方法与构造器不同的四大优势:

第一大优势,它们有名称。

我们都知道,在实例化类的时候,往往会调用类中的构造函数,构造函数的名称是相同的,只有参数不同,参数可以有顺序,类型的不同,从而是整个构造方法不同。这给我们带来的麻烦就是,很多时候我们会不知道要使用哪个或者使用这个构造函数往往需要填写不需要的数据,数量少还好说,万一数量多了,数据就不受控制了。这个时候,静态工厂方法的优势就体现出来了,直接使用名称的形式简单明了。

第二大优势,不必每次调用他们的时候都创建一个新对象。

这里可以使用单利的思维思考,因为单利的目的就是为了不重复创建对象。它可以每次都返回一个对象,进行重复使用。在很多情况下,这种方式可以让开发人员清楚的把控创建的对象,有利于开发与维护。还有利于性能的提升。

第三大优势,它们可以返回原类型的任何子类型的对象。

在设计模式中的基本原则之一------->里氏替换,就是说子类能替换父类

显然,构造方法只能返回确切的自身类型,而静态工厂能更加灵活,可以根据需要方便的返回它的任何子类类型的实例。

例如:

以上代码可以清楚的发现,使用Person可以返回Person的实例,也可以使用子类返回Person的实例。

第四大优势,在创建参数化类型实例的时候,使得代码更加简洁。

这个优势我觉得没有多大的解释意义,如下代码

Map<String.List<String>> map=new HashMap<String,List<String>>();

这个实例需要创建的时候,需要写那么冗长,很多时候吃不消,然后就有了如下的设计

Public static <K,V> HashMap<K,V> newInstance(){

Return new HashMap<K,V>();

}

使用的时候就直接使用下面这个就简洁多了。

Map<String,List<String>> map=HashMap.newInstance();

所以我觉得用起来方便,但是它们内部把之前要做的步骤都做了,展现的是我们看到的,这个好处就显而易见了。

静态共仓方法的缺点:

第一缺点:类如果不含有公有的或者受保护的构造器,就不能被子类化:

这句话的理解是:就是说在创建静态工厂的时候,使用私有的关键词修饰了之后,子类就实例化不了父类的实例。

第二个缺点:它们与其他静态方法实际上没有任何区别。

总结:静态工厂与构造器各有千秋,我们理解了它们之后,需要使用各自的长处,而不是一贯的使用构造方法,忘记静态工厂方法。

最新文章

  1. db2设置共享内存
  2. S2 易买网总结
  3. empty()与remove([expr])的区别.转
  4. 关于php用simplexml_load_string解析xml出现乱码的小结
  5. css3百叶窗轮播图效果
  6. Android JNI入门第二篇——Java参数类型与本地参数类型对照
  7. Android JNI入门第一篇——HelloJni
  8. 2006 ACM Northwestern European Programming Contest C题(二分求最大)
  9. ubuntu下vsftpd配置
  10. TCP建立连接和断开连接图解
  11. 【眼见为实】自己动手实践理解REPEATABLE READ &amp;&amp; Next-Key Lock
  12. asp.net core系列 48 Identity 身份模型自定义
  13. Kafka监控系统Kafka Eagle:支持kerberos认证
  14. UOJ#450. 【集训队作业2018】复读机 排列组合 生成函数 单位根反演
  15. (PMP)第1章-----引论
  16. Redis集成到Spring做mybatis做二级缓存
  17. PE结构图示
  18. 廖雪峰网站:学习python基础知识—循环(四)
  19. Pycharm新建文件时自动添加基础信息
  20. numpy和Matplotlib篇---2

热门文章

  1. php 二维数组验证一个值是否存在
  2. BEC listen and translation exercise 34
  3. php-fpm进程内存泄漏
  4. mfc创建文档视图过程
  5. 通俗解释glLoadIdentity(),glPushMatrix(),glPopMatrix()的作用
  6. linux命令学习笔记(35):ln 命令
  7. SQLite优化方法
  8. torch7 安装中Missing dependencies for nn:moses >= 1错误解决办法
  9. ACM学习历程—HDU 5023 A Corrupt Mayor&#39;s Performance Art(广州赛区网赛)(线段树)
  10. VBS错误代码释义