单例模式

来源:互联网 发布:美国制造业 知乎 编辑:程序博客网 时间:2024/05/18 02:44

------------------------------------单例模式-----------------------------------------

²  单例模式(单态模式)(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();

       }

}

原创粉丝点击