深入解析单例模式:定义、特点、优缺点及应用场景详解

1。单例模式的定义和特征

深入解析单例模式:定义、特点、优缺点及应用场景详解

Singleton模式是一种创建设计模式,它是针对全球只需要一个对象的场景设计的,例如线程池,全局缓存,窗口对象等。它被定义为:

确保类只有一个实例,并提供一个全局访问点访问它。

Singleton模式的三个特征:

Singleton模式被特别广泛使用,因为其设计模式是在整个项目环境中只能有一个静态对象实例,这将增强资源的可重复性并避免项目中使用的频繁对象。系统的创建和破坏降低了系统的性能!

2。辛格尔顿模式的优点和缺点2.1 Singleton模式的优势2.2 Singleton模式的缺点3。singleton模式的应用程序场景

对于Java,Singleton模式可以确保JVM中只有一个实例。 Singleton模式的应用程序方案主要包括以下方面。

4。单例模式的结构和实施

Singleton模式是设计模式中最简单的模式之一。通常,正常类的构造函数是公开的,外部类可以通过“ new构造函数()”生成多个实例。但是,如果类构造函数设置为私有,则外部类无法调用构造函数,并且无法生成多个实例。目前,课程本身必须定义静态私人实例,并提供静态公共功能来创建或获得静态私人实例。

以下是分析其基本结构和实现方法。

4.1单例模式的结构

4.2 Singleton模式的实现4.2.1懒惰的单身

这种模式的特征是,加载类时,没有生成单例,并且只有在第一次调用getlnstance方法时才会创建此单例。代码如下:

public class LazySingleton {
    private static volatile LazySingleton instance = null;    //保证 instance 在所有线程中同步
    private LazySingleton() {
    }    //private 避免类在外部被实例化
    public static synchronized LazySingleton getInstance() {
        //getInstance 方法前加同步
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

注意:如果您正在编写多线程程序,请不要在上面的示例代码中删除关键字挥发性并同步,否则将存在非线程问题。如果未删除这两个关键字,则可以确保线程安全性,但是每次访问时必须同步它会影响性能并消耗更多资源。这是懒惰单人的缺点。

4.2.1饥饿的人

这种模式的特征是,一旦加载了类,创建了一个单例,以确保在调用getInstance方法之前已经存在单例。

public class HungrySingleton {
    private static final HungrySingleton instance = new HungrySingleton();
    private HungrySingleton() {
    }
    public static HungrySingleton getInstance() {
        return instance;
    }
}

饥饿风格的单身人士创建了一个静态对象,供系统创建同类时使用,并且将来不会更改。因此,它是线程安全的,可以直接用于多线程而没有问题。

5。单例模式的申请示例

[示例1]使用Lazy Singleton模型模拟美国当前总统对象的产生。

分析:在每个学期中,只有一位美国总统,因此此示例适合使用Singleton模型实施。下图显示了使用Lazy Singleton实现的结构图。

public class SingletonLazy {
    public static void main(String[] args) {
        President zt1 = President.getInstance();
        zt1.getName();    //输出总统的名字
        President zt2 = President.getInstance();
        zt2.getName();    //输出总统的名字
        if (zt1 == zt2) {
            System.out.println("他们是同一人!");
        } else {
            System.out.println("他们不是同一人!");
        }
    }
}
class President {
    private static volatile President instance = null;    //保证instance在所有线程中同步
    //private避免类在外部被实例化
    private President() {
        System.out.println("产生一个总统!");
    }
    public static synchronized President getInstance() {
        //在getInstance方法上加同步
        if (instance == null) {
            instance = new President();
        } else {
            System.out.println("已经有一个总统,不能产生新总统!");
        }
        return instance;
    }
    public void getName() {
        System.out.println("我是美国总统:特朗普。");
    }
}

程序运行结果如下:

产生一个总统!
我是美国总统:特朗普。
已经有一个总统,不能产生新总统!
我是美国总统:特朗普。
他们是同一人!

示例2]使用饥饿中文的单例模型生成Zhu Bajie对象。

分析:类似于上面的示例,朱伊(Zhu Bajie)也只有一个,因此此示例也适合使用Singleton模型实现。由于此示例想显示Zhu Bajie的图像(单击此处以下载要在此程序中显示的Zhu Bajie的图像),因此使用框架表单Jframe组件。这里的Zhu Bajie班是Singleton类,可以定义为小组jpanel的子类。它包含一个标签来保存Zhu Bajie的图像。客户表格可以获取Zhu Bajie对象并显示它。图3显示了使用饥饿的单人实现的结构图。

import java.awt.*;
import javax.swing.*;
public class SingletonEager {
    public static void main(String[] args) {
        JFrame jf = new JFrame("饿汉单例模式测试");
        jf.setLayout(new GridLayout(1, 2));
        Container contentPane = jf.getContentPane();
        Bajie obj1 = Bajie.getInstance();
        contentPane.add(obj1);
        Bajie obj2 = Bajie.getInstance();
        contentPane.add(obj2);
        if (obj1 == obj2) {
            System.out.println("他们是同一人!");
        } else {
            System.out.println("他们不是同一人!");
        }
        jf.pack();
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
class Bajie extends JPanel {
    private static Bajie instance = new Bajie();
    private Bajie() {
        JLabel l1 = new JLabel(new ImageIcon("src/Bajie.jpg"));
        this.add(l1);
    }
    public static Bajie getInstance() {
        return instance;
    }
}

程序运行结果如下图所示:

6。单例模式的扩展

Singleton模式可以扩展到有限的多案例(MultiTCM)模式。此模式可以生成有限数量的实例并将其保存在阵列列表中。当客户需要时可以随机获得它。结构图如下图所示:

本文的大部分内容都是从:C.Biancheng.net/view/1338.hks复制的

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

25阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

27阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

23阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读