單例模式

------------------------------------單例模式-----------------------------------------

²  單例模式(單態模式)(Singleton Pattern)單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例,這個類稱爲單例類,它提供全局訪問的方法。

²  模式動機:對於系統中的某些類來說,只有一個實例很重要,例如:雖然系統中可以有許多打印機,但是只能有一個打印機正在工作,一個系統只能有一個窗口管理器。怎樣保證一個對象只有第一次使用的時候實例化,以後要使用,就用第一次實例化的那個。某個界面點擊菜單打開窗口,再次點擊菜單,使用原來打開的那個窗口;windows裏面的任務管理器

實例一:

class TaskManagerWindow1{  //任務管理器窗口

       public TaskManagerWindow1(){

              System.out.println("實例化一個窗口");

              }

       public void show(){

              System.out.println("窗口顯示");

              }

       }

class Test1{

       public static void main(String[] args){

              //點擊任務欄菜單第一次

              TaskManagerWindow1 tmw1 = new TaskManagerWindow1();

              tmw1.show();

             

              //點擊任務欄菜單第二次

              TaskManagerWindow1 tmw2 = tmw1;

              tmw2.show();

              /*該方法能夠實現單例,但是實際工程中不可能實現,原因:

              1:點擊菜單欄第二次時候,你無法知道第一次窗口是否存在

              2TaskManagerWindow tmw2 = tmw1強迫程序員記住了tmw1,

                     如果代碼很多,限制了程序員的工作

              3:在多個模塊中如果都允許點擊菜單的話,別的模塊不認識

                     本模塊裏面的局部變量tmw1,而傳參數又太麻煩

              */           

       }

}

實例二:餓漢式

class TaskManagerWindow2{  //任務管理器窗口

//不管用不用,先實例化再說,這叫做餓漢式

       private static TaskManagerWindow2 tmw = new TaskManagerWindow2();

       public static TaskManagerWindow2 getInstance(){

              return tmw;

              }

       private TaskManagerWindow2(){

              System.out.println("實例化一個窗口");

              }

       public void show(){

              System.out.println("窗口顯示");

              }

       }

class Singleton2{

       public static void main(String[] args){

              //點擊任務欄菜單第一次           

              TaskManagerWindow2 tmw1 = TaskManagerWindow2.getInstance();          

              tmw1.show();

              //點擊任務欄菜單第二次

              TaskManagerWindow2 tmw2 = TaskManagerWindow2.getInstance();          

              tmw2.show();

       }

}

實例三:懶漢式

class TaskManagerWindow4{  //任務管理器窗口

//需要用到時候再實例化,這叫做懶漢式(有安全隱患)

       private static TaskManagerWindow4 tmw = null;

      

       //安全隱患?多個線程都運行這個函數

       public static TaskManagerWindow4 getInstance(){

              if(tmw==null){

                     tmw = new TaskManagerWindow4();

                     }

              return tmw;

              }

             

       private TaskManagerWindow4(){

              System.out.println("實例化一個窗口");

              }

       public void show(){

              System.out.println("窗口顯示");

              }

       }

class Test4{

       public static void main(String[] args){

              //點擊任務欄菜單第一次           

              TaskManagerWindow4 tmw1 = TaskManagerWindow4.getInstance();          

              tmw1.show();

              //點擊任務欄菜單第二次

              TaskManagerWindow4 tmw2 = TaskManagerWindow4.getInstance();          

              tmw2.show();

       }     

}

 

實例四:

/*做一個Java界面1,上面有一個按鈕

點擊,出現一個紅色的另外的界面2

再點擊,出現的仍然是界面2,而不出現

新的界面,除非界面2關閉*/

 

class Frame1 extends Frame implements ActionListener{

       Button btn = new Button("打開界面2");

       public Frame1(){


              Panel p = new Panel();

              this.add(p);

              p.add(btn);

              btn.addActionListener(this);

              this.setSize(200,300);

              this.setVisible(true);

       }

       public void actionPerformed(ActionEvent e) {

              Frame2 frame = Frame2.newInstance();

              frame.setVisible(true);             

       }            

}

 

class Frame2 extends Frame implements ActionListener{

       private static Frame2 f2 = new Frame2();

       public static Frame2 newInstance(){

              return f2;

       }     

       private Button btn = new Button("關閉界面2");

       private Frame2(){

              Panel p = new Panel();

              p.setBackground(Color.red);

              this.add(p);

              p.add(btn);

              btn.addActionListener(this);

              this.setSize(200,300);

       }

       public void actionPerformed(ActionEvent e) {

              this.dispose();

       }     

      

}

 

class Singleton3 {

       public static void main(String[] args) {

              new Frame1();

       }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章