一、 考虑用静态工厂方法代替构造器:

1)静态工厂方法与构造器不同的第一大优势在于:他们有名称。当一个类需要多个带有相同签名的构造器时,就用静态方法代替构造器,并慎重的选择名称以突出他们间的区别;

2)静态工厂方法第二大优势: 不必在每次调用他们的时候都创建一个新对象;

3)静态工厂方法第三大优势: 他们可以返回原返回类型的任何子类型的对象;

4)静态工厂方法第四大优势: 在创建参数化类型实例的时候,他们使代码变得更整洁;

5)静态工厂方法缺点一:类如果不含公共的或者受保护的构造器,就不能被子类化;

6)静态工厂方法缺点二:他们与其他的静态方法没有任何区别;

二、 遇到多个构造器参数时要考虑用构建器:

1)第一种方式----重叠构造器:第一个构造器只有必要参数,第二个有一个可选参数,第三个有两个可选参数......最后一个包含所有可选参数。要创建实例的时候,就利用参数列表最短的构造器,但该列表中包含了要设置的所有参数(缺点在于当有许多参数时,客户端代码会很难写,并且仍然难以阅读)

2)第二种方法----JavaBeans模式:调用一个无参构造器来创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的必选参数。
(由于构造过程被分到了几个调用中,在构造过程中JavaBean可能存在不一致的状态,线程安全存在隐患)

3)Builder模式:不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或静态工厂),得到一个builder对象,然后客户端在builder对象上调用类似setter的方法来设置每个相关的可选参数,最后客户端调用午餐的build方法类生成不可变的对象。newInstance方法总是企图调用类的无参构造器,还会传播由无参构造器抛出的任何异常。

三、用私有构造器或者枚举类型强化Singleton属性:
Singleton指仅仅被实例化一次的类,通常用来代表那些本质上唯一的系统组件,实现Singleton有三种方法:

(1)公有静态成员是个final域,享有特权的用户可以调用AccessibleObject.setAccessible方法,通过反射机制调用私有构造器:

public class User{
public static final User INSTANCE = new User();
private User{
}
public void doSomeThing(){...}
}

(2)公有静态成员是个静态工厂方法:

public class User{
public static final User INSTANCE = new User();
private User{
}
public static User getInstance(){ return INSTANCE;}
public void doSomeThing(){...}
}

(3)单个元素的枚举类型:

public enum User{
INSTANCE;
public void doSomeThing(){...}
}

  

 

最新文章

  1. Lua 学习笔记(六)迭代器
  2. [转]div与span区别及用法
  3. python进阶学习三——第四天
  4. Python入门笔记(8):列表
  5. 学习笔记之 初试Caffe,Matlab接口提取feature
  6. 机器人学 —— 飞行机器人(Introduction)
  7. 在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world
  8. java运算符的优先级和详解
  9. UIWebView的使用,简单浏览器的实现
  10. javascript基础DOM操作
  11. Forget asp.net membership,ASP.NET Identity Overview
  12. Swift 函数和类
  13. C++设计模式-Iterator迭代器模式
  14. Oracle 11g DG手工switchover切换标准化流程
  15. Linux下一次删除百万文件
  16. Python打印:九九乘法表
  17. IntelliJ IDEA 配置 smartGit
  18. ORA-01578和ORA-26040--NOLOGGING操作引起的坏块-错误解释和解决方案(文档ID 1623284.1)
  19. android listView多层嵌套listView显示不全问题
  20. mavean导入本地仓库

热门文章

  1. Timus Online Judge:ural:1006. Square Frames
  2. Codeforces 626A Robot Sequence(模拟)
  3. Java 大数类BigInteger和BigDecimal的基本函数
  4. Sublime Text 3.0版本的傻瓜式汉化步骤
  5. in运算符(javascript)
  6. Ajax beforeSend和complete 方法
  7. Java数据库基础(JDBC)
  8. 滑稽的下午--angularjs 2.0管道的使用
  9. ublime Text 3安装与使用
  10. 微信小程序+和风天气完成天气预报