zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Linux系统下搭建Gitlab服务器
    Sqlserver数据库表转换成C#实体类
    C# 获取今天,昨天,上周,下周,上月,下月等等一些日期格式【转】
    Funthing
    网页生成海报
    NET 5.0 Swagger API 自动生成MarkDown文档
    说说C# 8.0 新增功能Index和Range的^0是什么?
    tblive-studio vs2019 编译过程记录
    确定已安装的 .NET Framework 版本
    修改CMD默认编码
  • 原文地址:https://www.cnblogs.com/zplogo/p/6344181.html
Copyright © 2011-2022 走看看