创建和销毁对象
考虑用静态工厂的方法代替构造器
类可以提供一个公有的静态工厂方法,它只是返回类的实例构造方法。这里所指的静态工厂方法不同于设计模式的静态工厂方法。
public static Boolean valueIOf(Boolean b) {
return b?Boolean.TRUE:Boolean.FALSE;
}
优势一:静态方法都有名称:通过名称判定更方便了解且更易阅读返回的内容是什么。
优势二:不必每次调用它们的时候都创建一个新的对象
优势三:在创建参数类型实例时,它们使代码变得更加简洁。
public class HashMapUtils {
public static<K,V> HashMap<K,V> newInstance(){
return new HashMap<K,V>();
}
}
Map<String,Object> map=HashMapUtils.newInstance();
缺点一:类如果不含有公有或者受保护的构造器,就不能被子类实例化。
缺点二:它于其它的静态方法实际上没有任何区别。
遇到多个构造器参数时,要考虑构建器
第一种情况,正常情况下有很多参数的时候我们会通过构造方法重载来进行区分,即为不同的参数列表创建不同功能的构造器,这样的结果就是阅读困难,其它开发人员也很难理解其中的意思。
第二种情况,我们要是用JavaBean来创建。这样就可以随意选择填写参数。但是这样JavaBean模式阻止了把类做成不可变的可能,这就需要程序员额外作出努力来确保它的线程安全。
第三种情况:这是推荐的一种方式,既能保证像重叠构造器模式那样的安全性,也能保证像JavaBean模式那么好的可读性。这就是Builder模式的一种形式,不直接生成你想要的对象,而是让客户端在builder调用类似setter的方法,来设置每个相关的可选参数。最后客户端调用无参的build方法来生成不可变的对象,这个builder是它构建的类的静态成员类。
package com.cui;
public class Car {
private final String name;//车名
private final int size;//大小
private final int number;//车牌号
private final String brand;//品牌
private final String factoryAddress;//生产厂家
public static class Builder{
//需要传入的参数
private final int number;//车牌号
private final String factoryAddress;
//初始化参数
private String name="car";//车名
private int size=2;//大小
private String brand="brand";//品牌
public Builder(int number,String factoryAddress) {
this.number=number;
this.factoryAddress=factoryAddress;
}
public Builder name(String val) {
name=val;
return this;
}
public Builder size(int val) {
size=val;
return this;
}
public Builder brand(String val) {
brand=val;
return this;
}
public Car builder() {
return new Car(this);
}
}
public Car(Builder builder) {
name=builder.name;
size=builder.size;
number=builder.number;
brand=builder.brand;
factoryAddress=builder.factoryAddress;
}
public String getName() {
return name;
}
public int getSize() {
return size;
}
public int getNumber() {
return number;
}
public String getBrand() {
return brand;
}
public String getFactoryAddress() {
return factoryAddress;
}
}
这就是构建器的代码,接下来进行调用。
方式一
public static void main(String[] args) {
Builder builder=new Car.Builder(11,"Japan");
Car car=builder.brand("toyto").builder();
System.out.println(car.getBrand()+"---"+car.getFactoryAddress()+"---"+car.getNumber());
}
结果如下:
toyto---Japan---11
方式二:
public static void main(String[] args) {
Car car=new Car.Builder(12, "German").builder();
System.out.println(car.getBrand()+"---"+car.getFactoryAddress()+"---"+car.getNumber());
}
结果如下:
brand---German---12
Builder像一个构造器一样,可以对其参数加强约束条件,builder方法可以检查这些约束条件,将参数builder拷贝到对象之后,并在对象域而不是builder域中对他们进行检验,这一点很重要。