• Java设计模式(01--单例模式)


    概念:设计模式是一套被反复使用,多数人知晓的、经过分类编目的、代码设计经验的总结。

    目的:使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性。

    单例模式的使用场景:
    很多时候有些对象我们只需要一个,如配置文件,工具类、线程池、缓存、日志等。
    如果创造出多个实例就会导致很多问题,如占用过多资源,不一致的结果等。

    单例模式作用:可以保证整个应用中某个实例有且只有一个。

    “饿汉”模式与“懒汉”模式的区别
    “饿汉”模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全。
    “懒汉”模式的特点是加载类时比较快,但运行时获取对象的速度比较慢(第一次调用获取类实例的方法时,应用中不存在类实例,需要创建),其线程是不安全的。

    1)"饿汉"模式

     1 package com.singleton;
     2 
     3 /**
     4  * @author zplogo
     5  * 单例模式————“饿汉”模式,需要思考每一步为啥用相应的权限修饰符。
     6  */
     7 public class Singleton {
     8     // 1.将构造方法私有化,不允许外部直接创建对象
     9     private Singleton(){
    10         
    11     }
    12     
    13     // 2.内部调用自己的私有构造方法创建类的唯一实例,出于安全控制用private修饰,不允许外部直接访问类的成员变量,static保证类加载的时候就生成类的实例
    14     private  static Singleton instance = new Singleton();
    15     
    16     // 3.提供一个获取类的实例的方法,用public static修饰
    17     public static Singleton getInstance(){
    18         return instance;
    19     }
    20 }

    2)“懒汉”模式

     1 package com.singleton;
     2 
     3 /**
     4  * @author zplogo
     5  * 单列模式————“懒汉”模式,其特点类加载的时候并不创造类的实例,外部调用获取类实例的方法时才去检查创建类的唯一实例,如果存在就不创建。
     6  */
     7 public class Singleton2 {
     8     // 1.将构造方法私有化,不允许外部直接创建对象
     9     private Singleton2(){
    10         
    11     }
    12     
    13     // 2.仅声明类的实例,用private static修饰
    14     private  static Singleton2 instance;
    15     
    16     // 3.提供一个获取类的实例的方法,用public static修饰
    17     public static Singleton2 getInstance(){
    18         if(instance == null){
    19             instance = new Singleton2();
    20         }
    21         return instance;
    22     }
    23 }

    3)测试类

     1 package com.singleton;
     2 
     3 /**
     4  * @author zplogo
     5  * 测试类:用于测试单例模式。
     6  */
     7 public class TestSingleton {
     8 
     9     public static void main(String[] args) {
    10         // 用于测试单例模式————“饿汉”模式
    11         Singleton s1 = Singleton.getInstance();
    12         Singleton s2 = Singleton.getInstance();
    13         if(s1==s2){
    14             System.out.println("s1和s2是同一个实例");
    15         }else{
    16             System.out.println("s1和s2不是同一个实例");
    17         }
    18         
    19         // 用于测试单例模式————“饿汉”模式
    20         Singleton2 s3 = Singleton2.getInstance();
    21         Singleton2 s4 = Singleton2.getInstance();
    22         if(s3==s4){
    23             System.out.println("s3和s4是同一个实例");
    24         }else{
    25             System.out.println("s3和s4不是同一个实例");
    26         }
    27     }
    28 
    29 }
  • 相关阅读:
    一个用于录制用户输入操作并实时回放的小工具
    Ubuntu 14.04 下安装wiznote客户端
    lombok @EqualsAndHashCode 注解的影响
    初始化数据库和导入数据
    com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定
    fastjson如何指定字段不序列化
    Mybatis 查询tinyint(1)的数据库字段时会自动转换成boolean类型
    Maven中settings.xml的配置项说明
    logback的使用和logback.xml详解
    解决Eureka Server不踢出已关停的节点的问题
  • 原文地址:https://www.cnblogs.com/zplogo/p/6344181.html
Copyright © 2020-2023  润新知