概念:
全域性只有乙個例項,自行例項化物件,自行向整個系統提供這個例項。
應用場景:
優點:缺點:
餓漢式類載入的時候就開始載入,使用的是靜態變數,由jvm的classloader機制避免了執行緒安全問題,保證執行緒安全。
缺點:一開始便載入占用記憶體,沒有達到懶載入效果,如果例項化是耗費資源的,則懶載入可以節省載入時耗費的資源。另外如果例項一直沒有使用會占用記憶體。
public class singleton
public static singleton getinstanceo()
}
餓漢式的另外方式
與正常的餓漢式並沒有太大的區別。
public class singleton
private singleton(){}
public static singleton getinstance()
}
懶漢式
延遲載入,在呼叫getinstance的時候才開始載入,無須一直占用系統資源。從資源利用率的角度來講優於餓漢式。
缺點:執行緒不安全,當執行緒a判斷了是空的時候進行建立物件,在建立物件前線程b進來判斷到是空,也建立了物件,因此執行緒a和執行緒b的物件不一致。
public class singleton
public static singleton getinstance()
return single;
}}//優化---增加鎖機制 1 ,在方法上加
public synchronize singleton getinstance()
}//缺點:鎖住了整個類,這個類中的其他成員變數也需要等待釋放鎖後被其他執行緒使用,效率低下。
//優化,雙重鎖校驗,缺點:可能會出現等待時間,降低系統效能。
public static singleton getinstance()}}
return single;
}
靜態內部類
靜態內部類不是在一開始啟動的時候載入,而是第一次呼叫的使用載入,實現了懶載入,並且由jvm的classloader機制實現執行緒同步,保證執行緒安全。
虛擬機會保證乙個類的構造器()方法在多執行緒環境中被正確地載入,同步,如果多個執行緒同時去初始化乙個類,那麼只有乙個執行緒去執行這個類的.
public class singleton
public static singleton getinstance()
}
概念:
實現一對多的依賴關係,當一方改變時,存在依賴關係的多方可以做出更改。
即發布訂閱關係,發布者發布訊息,存在訂閱關係的訂閱者可以接收訊息。
包含的類
定義被觀察者介面
public inte***ce iobservable
定義觀察者介面public inte***ce iobserver
具體被觀察者實現public class myobservable impelement iobservable
@override
public void registobserver(iobserver o)
}@override
public void removeobserver(iobserver o)
}@override
public void notifyobserver()
}
概念:
集中建立產品的類,是呼叫者和具體建立例項類分離開來,實現解偶。
概念與步驟
又叫靜態工廠模式,通過工廠類根據型別建立不同的例項類。
優點:結構簡單,便於理解。客戶不用關心具體的類的建立過程。
缺點:**邏輯較其他工廠模式複雜,新增產品時必須修改工廠類。當需要建立的模擬較多時,工廠類會變的較為臃腫。
//需建立的例項類的共同點
public inte***ce car
//具體例項
public class audi
}public class baoma
}//工廠類
public class ca***ctory
return car;
}}
概念與步驟
把工廠類抽象出去,建立例項由具體的工廠類實現,針對每乙個產品都由自己的具體工廠類實現。
優點:呼叫者無需關心產品的實現,只需要關心產品的介面。增加新的產品時,只要介面不變,不需要修改工廠類的邏輯,實現解偶。
缺點:模擬較多,如果需要建立多個產品的時候專案結構會比較大。
//抽象工廠介面
public inte***ce ifactory
//具體工廠類
public class audifactory impelement ifactory
}//抽象產品
public inte***ce car
//具體的產品
public class audi impelement car
}//新增產品時新增產品類及產品工廠類
概念與步驟
具有關聯功能的產品作為乙個產品族。 步驟:抽象工廠類,定於具體工廠類必須要實現的方法。
具體工廠類,建立一族產品;抽象產品類:定義產品的共性。具體產品類:建立具體的產品。
優點:具有工廠方法模式的優點外,另外可以在類內對產品族進行約束。
缺點:擴充套件比較麻煩。
試用場景:當建立的物件是一系列相互關聯或相互依賴的產品族時適用。
//抽象工廠類
public inte***ce abstractfactory
//抽象產品類
public abstract class abstractcar
public abstract class abstractplane
//具體工廠類
public class bigfactory implements abstractfactory
@override
public abstractplane createplane()
}//具體產品類
public class bigcar extends abstractcar
}class bigplane extends abstractplane
}
java設計模式 觀察者模式
本例以貓和老鼠來講解觀察者,首先定義觀察者為 老鼠和主人,被觀察者為貓,如下 public inte ce observer public class event public string getname public class mouse implements observer public ...
Java設計模式 觀察者模式
在物件之間定義一對多的依賴關係,這樣一來,當乙個物件改變狀態,依賴它的物件都會收到通知,並自動更新。比如有乙個天氣的資料來源,和需要獲取天氣資料的觀察者。天氣資料不定時更新。而觀察者也是隨時訂閱和取消訂閱天氣資料來源。在訂閱時,希望每次天氣資料更新時觀察者都可以獲取資訊。天氣資料來源作為被觀察的主題...
Java設計模式 觀察者模式
觀察者模式是乙個使用率非常高的的模式,它是一套訂閱 發布系統,這個模式最重要的作用就是將訂閱者和被訂閱者解耦。定義物件間一種對多種的依賴關係,使得每當乙個物件改變狀態,則所有依賴於它的物件都會得到通知。subject 抽象主題類,也就是被觀察者 observable 把所有觀察者物件儲存在乙個集合裡...