設計模式(一)
單例設計模式
單例就是某個實體只產生一個對象肥隆,如果只能產生一個對象那么就需要將構造函數設置為private的怎囚,那么就無法手動去創(chuàng)建該類的實體對象捉撮。
public class Student {
? ? ?private Student(){}
? ? ?private static Student s=new Student();
? ? ?public static Student getInstance(){
? ? ? ? ? return s;
? ? ?}
}
由于在類中直接創(chuàng)建除了實體的對象灾梦,這種方式被稱為餓漢式。但是如果創(chuàng)建該對象的時候需要消耗大量的資源槐雾,那么在不使用該對象的時候盡量不要去初始化
public class Student {
? ? ?private Student(){
? ? ?//消耗很多資源
? ? ?}
? ? ?private static Student s;
? ? ?public static Student getInstance(){
? ? ? ? ? if(s==null){
? ? ? ? ? ? ? ?s=new Student();
? ? ? ? ? }
? ? ? ? ? return s;
? ? ?}
}
上面這種方式避免了在不需要使用實體對象的時候對實體對象進行初始化夭委,但是在多線程并發(fā)的時候,會出現線程1執(zhí)行到s=new Student()的時候線程2執(zhí)行到if(s==null)募强,這個時候就有可能創(chuàng)建兩個實體對象株灸,為了避免以上的情況出現需要添加synchronized關鍵字崇摄。
public class Student {
? ? ?private static Student s;
? ? ?private Student(){}
? ? ?public static Student getInstance(){
? ? ? ? ? if(s == null){
? ? ? ? ? ? ? ?synchronized(Student.class){
? ? ? ? ? ? ? ? ? ? if(s == null){
? ? ? ? ? ? ? ? ? ? ? ? ?s = new Student();
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?}
? ? ? ? ? }
? ? ? ? ? return instance;
? ? ?}
}