-
設(shè)計模式——單例模式
一、介紹? ??
設(shè)計模式更多的是思想層面,是一套被反復使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了使代碼高可用,易于他人理解以及保證代碼的可靠性。
????設(shè)計模式有23中:單例模式、抽象工廠模式、工廠模式、建造者模式、原型模式等。
????單例模式(使用單例模式就是為了保證整個應用中某個實例有且只有一個):
???????? 在程序開發(fā)中,有些對象只需要一個,比如:配置文件、工具類、線程池、緩存、日志對象等;如果創(chuàng)建多個對象,會導致很多問題,比如資源占用,結(jié)果不一致等等。
二、實現(xiàn)
單例模式(Singleton):
????餓漢模式(靜態(tài)成員屬類所有,加載類時,就會創(chuàng)建類的唯一實例,不管用戶是否使用這個實例,它已經(jīng)被加載,形象的稱之為“餓漢模式”):
public?class?Singleton{ //默認的構(gòu)造方法在創(chuàng)建對象時被調(diào)用;多次new則創(chuàng)建多個類對象 ???//1、私有化構(gòu)造方法(外部無法直接通過構(gòu)造方法創(chuàng)建實例,避免創(chuàng)建多個實例) ???private?Singleton(){} ???//2、保證實例只有一個,自己創(chuàng)建實例(創(chuàng)建類的唯一實例,使用private?static修飾類的靜態(tài)成員) ???//因外部類無法直接使用對象.成員方法(),所以使用static靜態(tài)修飾對象,用類名.成員名創(chuàng)建實例 ???//為了控制訪問、安全,加private不允許外部訪問成員變量,不能使用類名.成員名創(chuàng)建實例 ???private?static?Singleton?instance?=?new?Singleton(); ???//3、提供一個用于獲取實例的方法(屬于對象方法,不用static修飾的話無法用類名.方法創(chuàng)建實例) ???/*public?Singleton?getInstance(){ ???????return?instance; ???}*/ ???//使用public?static修飾類方法 ???public?static?Singleton?getInstance(){ ???????return?instance; ???} }
public?class?Test{ ???public?static?void?main(String[]?args){ ???????//私有化構(gòu)造方法后,外部類無法直接創(chuàng)建實例 ??????? ???????/*Singleton?s1?=?Singleton.instance;//調(diào)用靜態(tài)成員創(chuàng)建實例 ???????Singleton?s2?=?Singleton.instance;//調(diào)用靜態(tài)成員創(chuàng)建實例 ???????if(s1==s2){//true??保證創(chuàng)建的Singleton對象是單個實例 ???????????System.out.println("s1和s2是同一個實例"); ???????}else{ ???????????System.out.println("s1和s2不是同一個實例"); ???????}*/ ???????//調(diào)用失敗,方法是對象方法(沒有用static修飾的方法) ???????/*Singleton?s1?=?Singleton.getInstance();*/ ???????Singleton?s1?=?Singleton.getInstance(); ???????Singleton?s2?=?Singleton.getInstance(); ???????if(s1==s2){//true??保證創(chuàng)建的Singleton對象是單個實例 ???????????System.out.println("s1和s2是同一個實例"); ???????}else{ ???????????System.out.println("s1和s2不是同一個實例"); ???????} ???} }
????懶漢模式(類加載時不創(chuàng)建唯一實例,當?shù)谝粋€用戶獲取時判斷實例為空時時創(chuàng)建,之后所有用戶獲取已經(jīng)存在的實例將不再創(chuàng)建):
public?class?Singleton2{ ???//1、私有化構(gòu)造方法,不允許外部直接通過構(gòu)造方法創(chuàng)建對象 ???private?Singleton2(){} ???//2、聲明類的唯一實例,使用private?static?修飾 ???private?static?Singleton2?instance?; ???//3、提供一個用于獲取實例的方法,使用public?static修飾 ???public?static?Singleton2?getInstance(){ ???????if(instance?==?null){ ???????????instance?=?new?Singleton2(); ???????} ???????return?instance; ???} }
public?class?Test{ ???public?static?void?main(String[]?args){ ???????Singleton2?s3?=?Singleton2.getInstance(); ???????Singleton2?s4?=?Singleton2.getInstance(); ???????if(s3==s4){//true??保證創(chuàng)建的Singleton對象是單個實例 ???????????System.out.println("s3和s4是同一個實例"); ???????}else{ ???????????System.out.println("s3和s4不是同一個實例"); ???????} ???}
?三、區(qū)別
????????餓漢模式加載類時比較慢,運行時獲取對象速度比較快,線程安全;
????????懶漢模式加載類時比較快(加載類時沒有創(chuàng)建類的對象),但運行時獲取對象速度比較慢(用戶第一次獲取對象時由于類還沒有被創(chuàng)建,需要創(chuàng)建對象的一個過程),線程不安全。
查看全部 -
單例模式六種實現(xiàn)方式查看全部
-
聲明實例和實例化 兩種模式區(qū)別在實例化的地方不一樣查看全部
-
對象方法和類方法: 類方法前加static,歸類所有,其他類可以直接調(diào)用該方法查看全部
-
static 類的查看全部
-
設(shè)計模式,單例模式 筆記 1,設(shè)計模式的定義。 用你的人多了,一種反復使用的,多數(shù)人知曉的,方法的總結(jié)。 2 餓漢模式 1)控制不可以被外部直接實例化對象,使用private修飾構(gòu)造函數(shù)。 2)私有化構(gòu)造函數(shù)后,外部無法創(chuàng)建實例化對象,所以要實現(xiàn)唯一實例對象,通過類對象實現(xiàn)。 單純的在類里實例化一個對象,該對象作為類成員,需要外部通過對象加點去獲取,但是外部沒有對象,就要通過添加static去將這個唯一實例化對象變成類的成員變量,通過類名的方式去獲取該對象。 3)為了安全考慮,不允許外部直接訪問類成員變量,給變量添加private修飾,此時,外部不可以通過類名直接訪問這個對象。 再添加一個public訪問函數(shù),同理,只添加public為類的對象,無法外部直接使用。所以添加static修飾,變?yōu)轭惙椒ā?4)該方法,加載類的時候直接實例化一個對象,所以加載較慢,但是調(diào)用較快 3 懶漢模式 加載的時候不實例化,第一次調(diào)用的時候?qū)嵗?。所以加載較快,使用較慢。 4 餓漢模式,線程安全 懶漢模式,線程不安全查看全部
-
懶漢模式查看全部
-
Singleton
查看全部 -
Singleton 懶漢式
查看全部 -
Singleton 餓漢式
查看全部 -
配置文件/工具類/線程池/緩存/日志對象等
查看全部 -
Design Pattern
查看全部 -
單例模式只有一個實例 餓漢模式 私有構(gòu)造方法 初始化實例private static 獲取實例方法public static 加載類時創(chuàng)建實例 所以慢 線程安全 懶漢模式 私有構(gòu)造方法 聲明實例private static 獲取實例方法public static里判斷實例是否為空 空初始化實例 不空返回實例 加載類時只聲明實例 所以快 用戶獲取實例時判斷是否為空 為空初始化實例 否則返回實例 線程不安全查看全部
-
Gh查看全部
-
1.設(shè)計模式:是一套被反復使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。 2.單例模式: 2.1應用場景:有些對象我們只需要一個,eg:皇帝、老婆 2.2作用:保證整個應用中某個實例有且只有一個 2.3類型以及實現(xiàn) 2.3.1餓漢模式 ①構(gòu)造方法私有化,private,不允許外部直接創(chuàng)建對象 ②創(chuàng)建類的唯一實例,使用private static修飾,類加載時就創(chuàng)建了,所以加載速度較慢。 ③提供一個用于獲取實例的使用public static修飾的方法,直接返回該實例,所以運行時獲取對象的速度比較快。 2.3.2懶漢模式 ①同餓漢 ②聲明類的實例,使用private static修飾,但不對其進行實例化,類加載時不進行創(chuàng)建 ③同餓漢,但是會在首次調(diào)用該方法時實例化聲明的類的實例,在之后的調(diào)用中返回該實例化對象。 3.區(qū)別 餓漢模式 加載類的速度較慢,運行時獲取對象的速度較快,同時是線程安全的 懶漢模式 加載類的速度較快,運行時第一次獲取對象的速度較慢,線程不安全,需要加鎖?查看全部
舉報