1. 程式人生 > >Effective Java(靜態工廠與構造器一)

Effective Java(靜態工廠與構造器一)

前言:因為是直接看完Think in Java後就入手Effective Java的,所以在閱讀的過程中難免有些不懂,便以一種閱與查的方式很費勁的去儘量的多深入瞭解Java,希望在看完後能夠有很大的提升,並將這一過程所獲以筆記形式記下來

第一條的標題是考慮用靜態工廠方法代替構造器,立馬就有一個問題便是為什麼要用靜態工廠方法代替構造器,更淺顯一點說什麼是靜態工廠方法,再進一步想到那麼為什麼要私有化物件呢?

下面從為什麼要私有化物件講起

私有化物件可以限制物件的個數,當然還有更多,從程式說吧

建立了一個私有化的建構函式的類

public class PrivateDemo {

	private PrivateDemo(){}
	public void print(){
		System.out.println("Hello World!");
	}
}
在一個類中去呼叫該類
public class Demo01 {

	public static void main(String[] args) {
		PrivateDemo demo;
		demo=new PrivateDemo();
	}
}
在demo=new PrivateDemo()這行報錯:The constructor PrivateDemo() is not visible

表明私有化構造器的類是不能夠new的

將上面兩個類改變一下,如下:

第一個類中新增一個獲取物件的方法

public class PrivateDemo {

	private PrivateDemo(){}
	
	public static PrivateDemo getInstance(){
		return new PrivateDemo();
	}
	
	public void print(){
		System.out.println("Hello World!");
	}
}
第二個類通過呼叫該方法來實現例項化物件
public class Demo01 {

	public static void main(String[] args) {
		PrivateDemo demo;
		demo=PrivateDemo.getInstance();
		demo.print();
	}
}
但是這樣寫之後給我的感覺是並不能看到私有化構造器後所帶來的不同,對於這個問題姑且先當做等價處理

對第一個類繼續改進,讓私有化構造器的作用顯得更突出,(因為私有化了構造器,要想呼叫類中的方法,必須使得類中的方法為static,通過類名進行呼叫)

public class PrivateDemo {

	private static PrivateDemo demo=new PrivateDemo();
	
	private PrivateDemo(){}
	
	public static PrivateDemo getInstance(){
		return demo;
	}
	
	public void print(){
		System.out.println("Hello World!");
	}
}
這樣之後,在其它類中不管多少次呼叫getInstance(),返回的物件均是同一個,這便是單例設計

有這樣的描述:Windows中的回收站,所有的盤都共享一個回收站,這便是一個典型的單態設計

對單態設計進一步瞭解,又分為餓漢式和懶漢式

餓漢式:先在類中new好物件,要呼叫的時候直接返回

懶漢式:在第一次呼叫的時候才例項化物件

下面是懶漢式的程式:

public class PrivateDemo {

	private static PrivateDemo demo;
	
	private PrivateDemo(){}
	
	public static PrivateDemo getInstance(){
		if(demo==null){
			demo=new PrivateDemo();
		}
		return demo;
	}
	
	public void print(){
		System.out.println("Hello World!");
	}
}

當然私有化構造器的作用遠不於此,與上相對,必不可少的要提到多例設計

即通過傳入的引數不同,可返回不同的物件

程式碼如下:

public class PrivateDemo {

	private static PrivateDemo demo1;
	private static PrivateDemo demo2;
	
	private PrivateDemo(){}
	
	public static PrivateDemo getInstance(int t){
		if(t==1){
			if(demo1==null){
				demo1=new PrivateDemo();
			}
			return demo1;
		}else if(t==2){
			if(demo2==null){
				demo2=new PrivateDemo();
			}
			return demo2;
		}else{
			return null;
		}
	}
	
	public void print(){
		System.out.println("Hello World!");
	}
}
通過傳入的t值不同,便可以new兩個物件

下一篇講靜態工廠

參考: