设计模式(9) -- 设计模式分类和单例模式(8种实现)

简介: 设计模式(9) -- 设计模式分类和单例模式(8种实现)

设计模式分类


1dc618a0ed9580ce8bfa6facb208c08f.png

单例模式


所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例 ,并且该类只提供一个取得其对象实例的方 法 静态方法 。

比如

Hibernate 的 SessionFactory ,它充当数据存储源的代理,并负责创建 Session对象。 SessionFactory 并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory 就够,这是就会使用到单例模式。


单例设计模式八种方式:


1)饿汉式 - 静态常量


public class SingletonTest01 {
    public static void main(String[] args) {
       //测试
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance + " === " + instance2);
        System.out.println(instance == instance2);
        System.out.println("instance.hashCode()==" + instance.hashCode());
        System.out.println("instance2.hashCode()==" + instance2.hashCode());
    }
}
/**
 * 饿汉式(静态常量)
 */
class Singleton{
    //1.构造器私有化,外部不能new
    private Singleton(){}
    //2.本类内部创建对象实例
    private final static Singleton instance = new Singleton();
    //3.提供一个公有的静态方法,返回实例对象
    public static Singleton getInstance(){
        return instance;
    }
}


优缺点:


5d4c6812c8535adbb050f4ddf2e1bce8.png


2)饿汉式 - 静态代码块


public class SingletonTest02 {
    public static void main(String[] args) {
        //测试
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance + " === " + instance2);
        System.out.println(instance == instance2);
        System.out.println("instance.hashCode()==" + instance.hashCode());
        System.out.println("instance2.hashCode()==" + instance2.hashCode());
    }
}
/**
 *  * 饿汉式(静态代码块)
 */
class Singleton{
    //1.构造器私有化,外部不能new
    private Singleton(){}
    //2.本类内部创建对象实例
    private static Singleton instance;
    static { //在静态代码块中,创建单例对象
        instance = new Singleton();
    }
    //3.提供一个公有的静态方法,返回实例对象
    public static Singleton getInstance(){
        return  instance;
    }
}


优缺点:


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


3)懒汉式- 线程不安全


public class SingletonTest03 {
  public static void main(String[] args) {
  System.out.println("懒汉式1 , 线程不安全~");
  Singleton instance = Singleton.getInstance();
  Singleton instance2 = Singleton.getInstance();
  System.out.println(instance == instance2); // true
  System.out.println("instance.hashCode=" + instance.hashCode());
  System.out.println("instance2.hashCode=" + instance2.hashCode());
  }
}
class Singleton {
  private static Singleton instance;
  private Singleton() {}
  //提供一个静态的公有方法,当使用到该方法时,才去创建 instance
  //即懒汉式
  public static Singleton getInstance() {
  if(instance == null) {
    instance = new Singleton();
  }
  return instance;
  }
}


优缺点


1dc618a0ed9580ce8bfa6facb208c08f.png


4)懒汉式 - 线程安全,同步方法


public class SingletonTest04 {
    public static void main(String[] args) {
        System.out.println("懒汉式2,线程安全");
        //测试
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance + " === " + instance2);
        System.out.println(instance == instance2);
        System.out.println("instance.hashCode()==" + instance.hashCode());
        System.out.println("instance2.hashCode()==" + instance2.hashCode());
    }
}
/**
 * 懒汉式(线程安全,同步方法)
 */
class Singleton{
    private static Singleton instance;
    private Singleton(){
    }
    public static synchronized  Singleton getInstance(){
        if (instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}


优缺点


5d4c6812c8535adbb050f4ddf2e1bce8.png


5)懒汉式 - 线程安全,同步代码块


public class SingletonTest05 {
    public static void main(String[] args) {
        System.out.println("懒汉式2,线程安全,同步代码块");
        //测试
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance + " === " + instance2);
        System.out.println(instance == instance2);
        System.out.println("instance.hashCode()==" + instance.hashCode());
        System.out.println("instance2.hashCode()==" + instance2.hashCode());
    }
}
/**
 * 懒汉式(线程安全,同步代码块)
 */
class Singleton{
    private static Singleton instance;
    private Singleton(){
    }
    public static Singleton getInstance(){
        if (instance == null){
            synchronized(Singleton.class){
                instance = new Singleton();
            }
        }
        return instance;
    }
}


优缺点:


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


6)双重检查


public class SingletonTest06 {
    public static void main(String[] args) {
        System.out.println("懒汉式,双重检查");
        //测试
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance + " === " + instance2);
        System.out.println(instance == instance2);
        System.out.println("instance.hashCode()==" + instance.hashCode());
        System.out.println("instance2.hashCode()==" + instance2.hashCode());
    }
}
//懒汉式(双重检查)
class Singleton{
    private static volatile Singleton instance;
    private Singleton(){}
    public static Singleton getInstance(){
        if (instance == null){
            synchronized (Singleton.class){
                if (instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}


优缺点:


66ba272a0bfc97be54a5fa679e3d5482.png


7)静态内部类


public class SingletonTest07 {
  public static void main(String[] args) {
  System.out.println("使用静态内部类完成单例模式");
  Singleton instance = Singleton.getInstance();
  Singleton instance2 = Singleton.getInstance();
  System.out.println(instance == instance2); // true
  System.out.println("instance.hashCode=" + instance.hashCode());
  System.out.println("instance2.hashCode=" + instance2.hashCode());
  }
}
// 静态内部类完成, 推荐使用
class Singleton {
  private static volatile Singleton instance;
  //构造器私有化
  private Singleton() {}
  //写一个静态内部类,该类中有一个静态属性 Singleton
  private static class SingletonInstance {
  private static final Singleton INSTANCE = new Singleton(); 
  }
  //提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE
  public static synchronized Singleton getInstance() {
  return SingletonInstance.INSTANCE;
  }
}


优缺点:


1dc618a0ed9580ce8bfa6facb208c08f.png


8)枚举


public class SingletonTest08 {
  public static void main(String[] args) {
  Singleton instance = Singleton.INSTANCE;
  Singleton instance2 = Singleton.INSTANCE;
  System.out.println(instance == instance2);
  System.out.println(instance.hashCode());
  System.out.println(instance2.hashCode());
  instance.sayOK();
  }
}
//使用枚举,可以实现单例, 推荐
enum Singleton {
  INSTANCE; //属性
  public void sayOK() {
  System.out.println("ok~");
  }
}


优缺点:


5d4c6812c8535adbb050f4ddf2e1bce8.png


实际单例的使用:


单例模式在 JDK 应用的源码分析


1)我们 JDK 中 java.lang.Runtime 就是经典的单 例 模 式 饿汉式


2)代码分析 +Debug 源码 代码说明

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


单例模式注意事项和细节说明


66ba272a0bfc97be54a5fa679e3d5482.png


相关文章
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
29 2
|
12天前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
26 4
|
21天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
3天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
29天前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
19 1
|
12天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
21 0
|
2月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将通过探讨单例模式,一种最常用的设计模式,来揭示其在PHP中的应用及优势。单例模式确保一个类仅有一个实例,并提供一个全局访问点。通过实际案例,我们将展示如何在PHP项目中有效实现单例模式,以及如何利用这一模式优化资源配置和管理。无论是PHP初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和技巧,进而提升自己的编程实践。
|
2月前
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy<T>` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
36 1
|
2月前
|
设计模式 缓存 数据库连接
探索PHP中的设计模式:单例模式的实现与应用
在PHP开发中,设计模式是提高代码可复用性、可维护性和扩展性的重要工具。本文将深入探讨单例模式(Singleton Pattern)的基本概念、在PHP中的实现方式以及实际应用场景。单例模式确保一个类仅有一个实例,并提供全局访问点。通过具体代码示例和详细解释,我们将展示如何在PHP项目中有效利用单例模式来解决实际问题,提升开发效率和应用性能。
|
2月前
|
设计模式 存储 测试技术
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发领域,设计模式是解决常见问题的最佳实践。本文将深入探讨单例模式,一种确保类只有一个实例的设计模式,并提供实际应用示例。我们将从单例模式的基本概念讲起,通过实际案例展示如何在PHP中实现单例模式,以及它在不同场景下的应用和优势。最后,我们会探讨单例模式的优缺点,帮助开发者在实际项目中做出明智的选择。