1. 考虑用静态工厂方法代替构造器
对于类而言,为了让客户端获取它自身的一个实例 ,最常用的方法就是提供 一个公有的构 造器。还有一种方法,也应该在每个程序员的 工具箱中占有一席之地。类可以提供一个公有 的静态工厂方法(staticfactorymethod),它只是 一个返回类的实例的静态方法。
类可以通过静态工厂方法来提供它的客户端,而不是通过构造器。提供静态工厂方法而不 是公有的构造器,这样做具有几大优势:
- 它们有名称。如果构造器的参数本身没有 确切地描述正被返回的对象,那么具有适当名称的静态工厂会更容易使用,产生的客户端代 码也更易于阅读,由于静态工厂方法有名称,当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器,并且慎重地选择名称以便突出它们之间的区别
- 静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新 对象。这使得不可变类(见第15条)可以使用预先构建好的实例,或者将构建好的实例缓存 起 来 , 进 行 重 复 利 用 , 从 而 避 免 创 建 不 必 要 的 重 复 对 象
- 它们可以返回原返回类型的任何子类型的 对象。这样我们在选择返回对象的类时就有了更大的灵活性
举例:
- new Student(),可以无参,有1个参数,有2个参数,如果使用静态工厂方法,则可以写成 getStudentWithUserName(String name), getBlankStudent(),比较明确
- 例如创建一个类的成本很高,需要set的参数较多,则可以将该流程放到静态工厂方法中,每次需要调用时通过这个set好,并且如果第二次调用可以使用缓存
- 例如Man extends Person, Woman extends Person,如果想通过一个factory创建,就可以写Person getPerson(String type)