所謂單態(單例),就是調用類模版創建的對象是同一個對象.好比一臺電視機(單態對象).有兩個遙控器(我們創建的對象引用). 但操作的卻是同一臺電視機.servlet類就是一個典型單例.
下面說明一下如何創建一個單態類:
首先將類的構造器私有化例如class Test{ private Test(){System.out.println("開始初始化");}//私有化構造器}
其次就是該類包含一個成員變量,此成員變量的類型和類本身一致:在第一步基礎上舉例如下:class Test{ private Test(){System.out.println("開始初始化");}//私有化構造器
private static Test instance;//定義一個Test類型的成員變量,
}
其次就是創建一個方法來返回一個Test對象.這裏要考慮的是用new Test()方法返回的話返回的對象當然是不同對象了.例如這樣:public static Test getNewTest(){return new Test();},想到上面我們已經定義了一個靜態變量.如果給它一個對象.我們再來訪問這個變量.因爲這個變量是靜態的,那麼不就是訪問的同一個對象了麼? 於是可以這麼做public static Test getInstance(){
if(instance==nuul)
instance =new Test();
return instance;
}
因爲這個變量是靜態的,所以對於調用者來說都是同一個.而這個靜態變量指向的又是單一的一個對象.當我們創建的該類引用變量時,實質上就是得到的這個靜態變量的引用.自然操作的對象就是同一個了.
下面貼上代碼.從代碼中更容易理解.
class test { public static void main (String[] args) throws java.lang.Exception { TV t1=TV.getInstance(); t1.setName("TCL"); System.out.println("未創建t2前.電視機的牌子是"+t1.getName()); TV t2=TV.getInstance(); t2.setName("華夏"); System.out.println("創建t2後,t1電視機的名字是"+t1.getName()); System.out.println("t2電視機的名字"+t2.getName()); if(t1==t2) System.out.println("t1和t2是同一臺電視機"); } } class TV{ private String name; private static TV instance; private TV(){ System.out.println("正在執行構造器...,,"); } public static TV getInstance(){ if(instance==null) instance=new TV(); return instance; } public void setName(String name){ this.name=name; } public String getName(){ return this.name; } }
代碼簡單易懂.這也使自己的一個學習總結吧..