1. 程式人生 > >01、考慮用靜態工廠方法代替構造器

01、考慮用靜態工廠方法代替構造器

優點

1. 有名稱,當一個類需要多個帶有相同引數的構造器時,就可以用靜態工廠方法代替構造器,並且慎重地選擇名稱以便突出它們之間的區別

例如下邊的有關汽車的類,可以使用三個靜態工廠方法返回不同的汽車

public class Car {
	private String name;

	private Car(String name) {
		this.name = name;
	}

	public static Car getFord() {
		return new Car("Ford");
	}

	public static Car getVolkswagen() {
		return new Car("Volkswagen");
	}

	public static Car getLamborghini() {
		return new Car("Lamborghini");
	}

	public String getName() {
		return this.name;
	}
}

2. 不必在每次呼叫它們的時候都建立一個新物件

單例

確保不可例項化

確保不會存在兩個相等的例項,當且僅當a==b的時候才有a.equals(b)為true,這樣可以用==代替equals方法,提高效能。例如列舉型別

3. 可以返回原返回型別的任何子型別的物件

下邊的例子,利用父類的靜態工廠方法返回三個不同的子類

public class Car2 {
	public static Car2 newFord() {
		return new Ford();
	}

	public static Car2 newVolkswagen() {
		return new Volkswagen();
	}

	public static Car2 newLamborghini() {
		return new Lamborghini();
	}
}

class Ford extends Car2 {
	public Ford() {
		System.out.println("Ford");
	}
}

class Volkswagen extends Car2 {
	public Volkswagen() {
		System.out.println("Volkswagen");
	}
}

class Lamborghini extends Car2 {
	public Lamborghini() {
		System.out.println("Lamborghini");
	}
}
4. 在建立引數化型別例項的時候,它們使程式碼變得更加簡潔

缺點

1. 類如果不含有公有的或者受保護的構造器,就不能被子類化

2. 與其他的靜態方法實際上沒有任何區別。方法名稱可以各式各樣,例項化的時候有可能會很迷惑

靜態工廠方法的慣用名稱

1. valueOf

2. of

3. getInstance

4. newInstance

5. getType

6. newType