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 }
  • 相关阅读:
    [ jquery 选择器 :hidden ] 此方法选取匹配所有不可见元素,或者type为hidden的元素
    剑指 Offer 03. 数组中重复的数字 哈希
    LeetCode 1736. 替换隐藏数字得到的最晚时间 贪心
    Leetcode 1552. 两球之间的磁力 二分
    Leetcode 88. 合并两个有序数组 双指针
    LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
    LeetCode 1743. 相邻元素对还原数组 哈希
    LeetCode 1745. 回文串分割 IV dp
    剑指 Offer 47. 礼物的最大价值 dp
    剑指 Offer 33. 二叉搜索树的后序遍历序列 树的遍历
  • 原文地址:https://www.cnblogs.com/zplogo/p/6344181.html
Copyright © 2011-2022 走看看