• 单例模式


    问题描述:设计单例模式的实现。

    分析:单例模式,即要求在整个程序中,某个类有且只有一个实例对象。因为在有些时候,我们只需要类有一个对象就行,这个时候我们就可以把这个类采用单例模式实现,

            例如系统的一些对象,比如时间等对象就可以设计为单例模式。

            常见的单例模式有两种类型:饿汉模式和懒汉模式。具体区别如下:

                                                                                               饿汉模式:加载类时比较慢(因为要创建对象),运行时获取对象的速度比较快,线程安全

                                                                                               懒汉模式:加载类时比较快(因为不用创建对象),运行时获取对象的速度比较慢,线程不安全

             为了便于读者理解,我写出了如下Java代码,分别实现了饿汉模式和懒汉模式,读者可以结合代码理解:

               饿汉模式如下:

     1 /*
     2  * 饿汉模式的实现Singleton1
     3  */
     4 public class Singleton1 {
     5       //1.将构造方法私有化,不允许外部直接创建对象
     6     private Singleton1(){
     7         
     8     }
     9     //2.创建类的唯一实例
    10     private static Singleton1 instance=new Singleton1();
    11     //3.提供一个用于获取实例的方法
    12     public static Singleton1 getInstance(){
    13         return instance;
    14     }
    15     
    16 }

           懒汉模式如下:

     1 /*
     2  * 懒汉模式的实现Singleton2
     3  */
     4 public class Singleton2 {
     5     //1.将构造方法私有化,不允许外部直接创建对象
     6     private Singleton2(){
     7         
     8     }
     9     //2.创建类的唯一实例
    10     private static Singleton2 instance;
    11     //3.提供一个用于获取实例的方法
    12     public static Singleton2 getInstance(){
    13         if(instance==null)
    14             instance=new Singleton2();
    15         return instance;
    16     }
    17 }

         测试代码如下:

     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4         // TODO 自动生成的方法存根
     5       Singleton1 s1=Singleton1.getInstance();
     6       Singleton1 s2=Singleton1.getInstance();
     7       if(s1==s2){
     8           System.out.println("s1和s2是同一个实例");
     9       }
    10       else System.out.println("s1和s2不是同一个实例");
    11                 
    12       Singleton2 s3=Singleton2.getInstance();
    13       Singleton2 s4=Singleton2.getInstance();
    14       if(s3==s4){
    15         System.out.println("s3和s4是同一个实例");
    16       }
    17       else System.out.println("s3和s4不是同一个实例");
    18     }
    19 
    20 }

    输出结果为:

    s1和s2是同一个实例
    s3和s4是同一个实例

  • 相关阅读:
    大三寒假学习进度(3)
    大三寒假学习进度(2)
    大三寒假学习进度(1)
    Tensorflow深度学习(二)
    Tensorflow深度学习(一)
    了解使用Pyppeteer
    为什么我还可以继续使用python自动填问卷星?
    周总结(十四)
    docker常用命令总结
    周总结(十三)
  • 原文地址:https://www.cnblogs.com/guozhenqiang/p/5495018.html
Copyright © 2020-2023  润新知