1. 程式人生 > >JAVA-初步認識-第八章-單例設計模式-概述體現

JAVA-初步認識-第八章-單例設計模式-概述體現

產生 比較 23種設計模式 設計 兩種 數據類型 計算機 一個 java

(本節講述的知識點,有像更新,一個變化,另一個也同時變化)

一.

接下來是比較重要的一部分知識點-設計模式。

設計模式的定義,從字面來看就是設計時的統一規範。

技術分享

java有23種設計模式,也可以用於C++,因為這是一種思想,在面向對象的語言裏都是通用的。

強調的是解決問題的思想,不拘泥於任何一種具體的計算機語言。

設計模式的核心在於:為了解決問題,設計了方法,並且不斷地改進這個方法,最終得到一個非常合適高效的解決方法

對於23種設計模式,我們今天討論其中的一種,單例設計模式。

學習設計模式要註意一點,設計模式是為了解決什麽問題。知道了解決什麽問題,自然也就知道了什麽時候用。

二.

技術分享

一個類在內存裏面只有一個對象,單例是指單個實例。

這種設計模式的名稱有好多種,不要被名稱所欺騙。重點在於保證類的對象唯一性。我們什麽時候需要類在內存中,只有一個對象呢?

單例設計模式要註意的就是兩點:什麽時候要保證類的對象唯一性?怎麽來保證類的對象的唯一性?

現在舉例介紹單例設計模式:
這有兩個應用程序A和B,它們都會用到一個配置信息。比如說這裏面有一些信息,num,age,name....

技術分享 技術分享

為了操作這些信息方便,我們通常都把這些信息封裝在對象當中。我找到了這些對象,就意味著我找到了這些信息。

我們把這個稱之為,能封裝信息的配置文件。(配置文件和對象之間是什麽關系對象只能封裝數據是麽?)

A想操作這些信息,就要在A中創建一個配置文件對象,甭管什麽配置信息,就是對象嘛。為什麽呢?信息多了,都要進行封裝,我們想操作信息,必須先找對象。A想操作配置文件裏的信息,要先建立對象,然後,再調用ConfigFile裏面的方法。操作完以後,A可能對ConfigFile裏面的信息進行了改變。比如,A把num1賦值為了10。(我感覺這裏面有點混亂。如果對象是放置在A中的,那麽後面說的A對ConfigFile裏面的信息進行改變,怎麽可能?因為這裏ConfigFile配置文件感覺像是描述類,裏面的成員變量怎麽發生變化

?)

技術分享 技術分享

接下來,B程序也想操作配置文件中的信息。(ConfigFile的出現像是一個描述類,A和B怎麽都會想著改變?)

按照上面的思路,B中也要創建一個對象,誰要操作信息,誰就創建對象。

但是,我們希望它們共用一個配置信息。A如果對ConfigFile進行操作的話,B要知道。簡單點來說,A將ConfigFile中的num1從1改為了10,B在操作num1的時候,必須知道它是10。

(這裏開始解惑) A創建一個ConfigFile配置文件的對象,new ConfigFile(); 裏面就有一組配置信息,B也在它自己的空間創建一個ConfigFile配置文件的對象後,它就有了一組新的配置信息,兩者互不相關。所以,A對自己的配置信息改完以後,和B是沒有關系的。→這從裏才看出前面知識點的影子。

兩個相同類類型的對象,本來封裝的數據互不相關,但是現在希望兩者產生聯系。

這是我們討厭的地方,我們希望兩者實現共享。

實現方法,將配置文件ConfigFile中的信息全部變成靜態,就可以了(為什麽?)。但是這裏面數據信息量很多,全靜態化,會導致生命周期過長(和類一起加載在方法區,存儲時間比較長,使得生命周期長)。既然我們用的是同一個對象(這裏說的同一個對象是怎麽操作的,是創建兩個互相關聯的對象麽?),我只要這個類(這個類,說的就是ConfigFile)和對象是唯一的(就是說該類只產生一個對象,那麽誰調用,都是這個,限制對象個數。),那麽A和B用的就是同一個。而且,對象的生命周期相對而言,短一些,不用的時候,可以變垃圾。這個時候,我們就只要保證A和B用到的,配置文件對象是同一個,就搞定了。怎麽解決這個問題呢?
(到目前為止,有一些談論的是和前面的知識點相聯系的,但還有相當一部分是和原先的理論體系是不一樣的)

現在有人對這個問題,提出了解決方案,我們直接拿來使用就可以了。我們不用他提供的方案,我們也可以自己寫。完全可以,設計模式本身就是對我們面向對象語言中產生的問題進行優化。設計模式是一種固定好的解決問題的方式,不采用也可以。

技術分享

觀看這個例子,我們知道,A中不能new一個對象,因為如果能用對象的話,A一新建,對象就會跑到A中,所以就不能再new新建了。(如果一個類要是能new對象,對方程序可以new,n多個出來,就不能保證對象的唯一性。)因此,第一步就是不讓A來new對象,因為一旦新建對象了,就不可控了。

不允許new,那就導致沒對象,為了保證唯一性,是不是還得有一個?現在不讓new,那麽那唯一的一個在哪?

我讓你new,我不能控制,但是我來new,就可以I控制。

技術分享

1的好處就是避免產生更多對象,對象一多容易出錯。

2,不讓new就安全了,但這麻煩了,你不讓我new,我就沒對象,說是保證唯一性,那還得有一個,你不讓我new,那一個跑哪去了?我不讓你new,我來new。這裏產生了變化,不讓你new,我來new,我可以進行控制,new一個就完事了。要保證單例,new一個就可以了。

3. 創建完本類實例後,要提供出去,給別人用。

就上面三步就能把單例這個動作做完。換句話說,用這三步,就能解決這個類的對象唯一性。接下來,這三步怎麽去實現啊?
步驟:

1. 私有化該類的構造函數。有幾個私有化幾個,都不向外提供。(怎麽就能實現不讓對方,創建我的對象呢?不讓初始化就可以)

2. 通過new在本類中,創建一個本類的對象。

3. 定義一個公有的方法,將創建的對象返回。(這說明是有返回值,是一個對象,本類類型的對象)

技術分享

上面的Single類中三步寫完了,緊跟著要用一下。我們怎麽調用getInstance的方法呢?我們得創建一個對象調用,

new Single().getInstance(); 這麽寫就廢了。因為在其他存類當中不能創建該類的對象,因為它被私有化了,因此new不成。但是getInstance()方法是非靜態的,如果不能夠new對象,這方法就不能調用(這句話是說,非靜態的方法必須是對象調用的。如果沒有對象,那就沒法調用。類只能調用靜態方法)。既然,不能創建對象,我們還要獲取對象(這話說的挺奇怪的,和後面的語句完全無關),這個方法要被調用的話,有兩種方法,第一個是對象調用,第二個是類名調用,但是類名調用有前提,必須是靜態(在getInstance方法前加上static修飾),而靜態訪問的內容必須是靜態的(在本類對象前要用static修飾)。因此,在主函數中,寫上Single.getInstance();就可以調用這個方法了,這個方法返回來一個s,s裏面持有一個地址。所以在這裏面可以寫上一個Single ss=Single.getInstance(); 這樣,我就拿到了這個類的實例(主函數中用變量ss來承接s的對象地址編碼)。→其實,思考下來也不難。不允許創建對象,只能使用唯一的對象。大家仔細回想一下,局部變量和所指向的對象在內存中分布圖。如果可以創建對象的話,那就是多個一對一的分布。但是這裏是禁止創建對象的,只允許特定的類中有一個固定的對象,只能通過多個引用變量指向同一對象來解決問題。特定的類必須要提供將對象地址提供出來的方法,來方便調用。下面截圖中的s有多種名稱,可以是靜態變量,Single類類型的引用變量,以及對象。

Single.getInstance(),類名調用本類靜態方法,返回給對方程序一個對象。沒法創建,但是可以通過方法提供出來。

說白了,這個s指向new Single()這個對象,ss指向的還是這個對象。

技術分享

這麽寫有一個疑問,s是不是Single類中的成員變量?s是定義在類中的,如果加一個int x=4; x就是成員變量,凡是定義在類中的都是(在這裏,對於成員變量和靜態變量的分解模糊起來。這說明什麽?兩者的分界,沒有想像的那麽清楚)。x是基本數據類型,s是引用數據類型。s本身就是成員,

技術分享

如果是成員,直接來個Single.s可以麽?貌似可以,是成員麽?是靜態麽?能通過類名直接調用麽?是。
技術分享

調用完了,書寫的格式如下所示。這裏Single後面的一個點號,就拿到了s,換句話說,就拿到了s所持有的對象地址,並把這個地址賦值給了ss,ss也就指向了這個對象。

技術分享

為什麽要這麽做呢?如果這麽能做的話,那調用方法還有什麽用,說的是調用getInstance()方法,只是調用了對象,幹嘛要寫一個方法,那我們搞這個方法還有什麽用?

技術分享

分析:開始,我們在類中定義變量,要寫get和set方法,

技術分享

如果將方法消去的話,會不可控,方法後面接有參數。以下圖的String name為例,當給定特定的名稱時,就返回s,當不符合名稱時,就不返回。誰說對象給你用,單例是單例,滿足需求才給你用,不滿足需求不給用。這叫可控,這是之前講過的上鎖。

技術分享

s是成員變量,一般我們是不會把成員變量暴露出去,是為了可控,所以加上private。私有的作用是什麽,怎麽用

技術分享

這裏判別是否是同一對象。這裏我想問的是,為什麽輸出語句還能有一個運算的功能

技術分享

按照題目所講述的來看,只要做到描述類中的三句話,就可以得到對象的唯一性,

技術分享

技術分享

現在我們想保證test類在內存中的對象唯一性。

在原有基礎上加了三步動作,

技術分享

技術分享

技術分享

JAVA-初步認識-第八章-單例設計模式-概述體現