1. 程式人生 > >常見的設計模式之工廠模式和單例模式

常見的設計模式之工廠模式和單例模式

工廠模式

工廠方法模式有兩個抽象類,一個是產品抽象類,一個是工廠抽象類,若干個具體產品類和對應的具體工廠類,具體產品抽象類與產品抽象類是實現關係,與具體工廠類是依賴關係,具體工廠類與抽象工廠類是實現關係。
工廠模式大概如圖
客戶端程式碼如下

在這裡插入圖片描述
工廠模式是定義一個用於建立物件的介面,讓子類決定將哪一個類例項化,工廠方法模式使一個類的例項化延遲到其子類。
(工廠模式要寫的類比較多,而且無法解決產品族的問題)

抽象工廠模式

抽象工廠的具體工廠不是隻是建立一種產品,而是負責建立一族產品。
在這裡插入圖片描述

抽象工廠的結構包括
1,抽象工廠
2,具體工廠
3,抽象產品
4,具體產品

可以解決不同產品族的不同產品的問題。例如A公司的電視,電腦和B公司的電視電腦,有一個相同的抽象工廠。然後建立A公司和B公司的具體工廠,建立電視和電腦的抽象產品類,延伸出A公司的電視電腦,B公司的電視電腦,A公司的具體工廠類建立A公司的具體產品,B公司建立B公司的具體產品。
例如
在這裡插入圖片描述

客戶端程式碼:

class Client
{	public static void main(String args[])
	{
		DBFactory factory; //抽象工廠
		Connection connection; //抽象產品
		Statement statement;  //抽象產品
		factory = new OracleFactory(); //指定具體工廠
		connection = factory.createConnection(); 
		statement = factory.createStatement();
		connection.connect();
		statement.executeStatement();
	}
}

單例模式

確保一個類只有一個例項,並提供一個全域性訪問點來訪問這個唯一例項。
在這裡插入圖片描述
私有構造方法,確保其他使用者無法用New建立,模式中包含一個靜態的私有成員變數和靜態的公有的工廠方法,該工廠方法負責檢驗例項的存在性並例項化自己,然後儲存在靜態成員變數中,以確保只有一個例項被建立。

public class Singleton
{	private static Singleton instance=null;  //靜態私有成員變數
	//私有建構函式
	private Singleton( )  {}
	
       //靜態公有工廠方法,返回唯一例項
	public static Singleton getInstance()
	{
		if(instance==null)
		    instance=new Singleton();	
		return instance;
	}
}

單例模式分為餓漢模式和懶漢模式
餓漢模式:在自己被家在的時候就將自己初始化。
在這裡插入圖片描述
懶漢模式:在呼叫的時候才將自己初始化。
在這裡插入圖片描述

餓漢式單例與懶漢式單例類比較
餓漢式單例類在自己被載入時就將自己例項化。單從資源利用效率角度來講,這個比懶漢式單例類稍差些。從速度和反應時間角度來講,則比懶漢式單例類稍好些。
懶漢式單例類在例項化時,必須處理好在多個執行緒同時首次引用此類時的訪問限制問題,特別是當單例類作為資源控制器,在例項化時必然涉及資源初始化,而資源初始化很有可能耗費大量時間,這意味著出現多執行緒同時首次引用此類的機率變得較大,需要通過同步化機制進行控制