JAVA单态设计模式
核心--在類的內部把構造器私有化,同時在內部產生對象,并通過類.靜態方法(static)返回實例化對象的引用
?
設計模式是在大量的實踐總結和理論化之后優選的代碼結果,編程風格,以及解決問題的思考方式.設計模式就像是經典的棋譜,不同的棋局我們用不同的棋譜.
單態設計模式:采取一定的方法保證在整個軟件系統中,對某個類只能產生一個對象實例,并且該類只提供一個取得其對象的實例方法.
在java中實現單態模式只需要執行以下三步: ?
??1.將類的構造方法的訪問權限聲明為private.這樣就不能用new操作符在類的外部產生類的對象了,但在類內部仍可以產生該類的對象.
??2.在類內部生成一個靜態的實例.
??3.提供一個靜態的方法用于外部取得該類的實例.
??因為在類的外部無法得到類的對象,所以只能調用該類的某個靜態方法以返回類內部創建的對象,又因為靜態方法只能訪問類中的靜態成員變量,所以,指向類內部產生該類對象的變量也必須定義成靜態的.
?
?
?
class Chinese{
????static Chinese objRef = new Chinese();
???
????private Chinese(){}
????public static Chinese getInstance(){
????????return objRef;
????}
}
?
class Chinese_opt{
????static Chinese_opt objRef = null;
????private Chinese_opt(){}
????public static Chinese_opt getInstance(){
????????if(objRef == null)
????????????objRef = new Chinese_opt();
????????return objRef;
????}
???
}
class TestChinese{
????public static void main(String[] args){
????????Chinese chinese1 = Chinese.getInstance();
????????Chinese chinese2 = Chinese.getInstance();
????????System.out.println(chinese1 == chinese2);
????}
}
?
?
?
?
?
1:構造方法私有化:
面向對象編程的三大特性:封裝、繼承、多態。類的封裝性不僅體現在對屬性的封裝上,實際上方法也是可以被封裝的,構造方法是特殊的方法當然也可以被封裝,例如下面的代碼就是對構造方法的封裝:
package?com.zxf.javaopp;
?
public?class?Singleton {
????private?Singleton(){?????//?將構造方法進行了封裝,私有化??
????}
????public?void?print(){
???????System.out.println("Hello World!!!") ;
????}
}
構造函數被私有化,不能在外部實例化,就無法在外部使用,此時只能在該類的內部實例化對象了,然后將該類拿到外部進行使用,由于該類不能再外部實例化,此時在內部的實例化必須是用static關鍵字修飾的:代碼如下:
package?com.zxf.javaopp;
?
class?Singleton1{
????static?Singleton1?instance?=?new?Singleton1() ;??//?在內部產生本類的實例化對象
????private?Singleton1(){???????//?將構造方法進行了封裝,私有化??
????}
????public?void?print(){
???????System.out.println("Hello World!!!") ;
????}
}
public?class?SingletonDemo01{
????public?static?void?main(String args[]){
???????Singleton1 s1 =?null?;???//?聲明對象
???????s1 = Singleton1.instance?;??//?取得實例化對象
???????s1.print() ;??????//?調用方法
????}
}
雖然上面的代碼實現了功能,但又有些問題:通常情況下:我們將屬性封裝,此時的代碼就要修改如下:
package?com.zxf.javaopp;
?
class?Singleton1{
????static?Singleton1?instance?=?new?Singleton1() ;??//?在內部產生本類的實例化對象
????public?static?Singleton1 getInstance(){???????//?通過靜態方法取得instance對象
???????return?instance?;
????}
????private?Singleton1(){???????//?將構造方法進行了封裝,私有化??
????}
????public?void?print(){
???????System.out.println("Hello World!!!") ;
????}
}
public?class?SingletonDemo01{
????public?static?void?main(String args[]){
???????Singleton1 s1 =?null?;???//?聲明對象
???????s1 = Singleton1.getInstance() ;?//?取得實例化對象
???????s1.print() ;??????//?調用方法
????}
}
以上的代碼似乎變得很復雜,不如不將構造方法實例化呢,但是為什么又會這樣做呢?
假如我們現在要產生幾個對象:按以往的代碼,就需要實例化多次,每個對象都有其對應的堆??臻g,此時的內存就消耗的很多,系統的效率坑定比較低,但是使用將構造方法封裝的模式效率就比較高:
?使用將構造方法封裝的方法:無論產生多少個對象,我們只實例化一次,這樣的設計在設計模式上稱為單態設計模式(單例設計模式):
singleton,如果不希望一個類產生多個實例的話,則必須使用單態設計模式,此設計模式,在以后的高性能開發中經常使用,而且在java的類庫中大量的使用了此設計模式。????所謂單態就是在入口處限制了對象的實例操作。
????單態設計模式的意義:
實際上這種模式非常常用,我們大家使用的windows操作系統中就使用了此設計模式,windows中用一個回車站:?,除了桌面以外,其他的每個硬盤中都有一個回車站,其他的回車站和其他硬盤的每個回車站都是同一個,也就是所整個操作系統中有且只有一個回車站,各個地方只是引用此實例。
總結:
單態設計模式的核心就是將類的
?構造函數私有化,在類的內部產生實例對象,并通過類的靜態方法返回類的實例對象。
轉載于:https://www.cnblogs.com/ChrisMurphy/p/5008870.html
總結
以上是生活随笔為你收集整理的JAVA单态设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html combobox select
- 下一篇: java.lang.NullPointe