欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

单例设计模式

程序员文章站 2022-04-09 08:38:57
1单例模式概述 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。 通常单例模式在Java语言中,有两种构建方式: 懒汉方式:指全局的单例实例在第一次被使用时构建。 饿汉方式:指全局 ......

单例设计模式可以保证系统中应用该模式的类一个类只有一个实例,即保证一个类有且只有一个对象(实例)。它的好处是,单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。因为类控制了实例化过程,所以类可以灵活更改实例化过程。所有的内容的都是唯一的, 可以用作共享数据来用。
在Java语言中,单例模式的要点有3个:1、一个类只能有一个实例,2、它必须自行创建这个实例,3、它必须自行向整个系统提供这个实例。从具体实现角度来说,通常有两种构建方式,我们分别称为饿汉式和懒汉式。其中,懒汉式是线程不安全的,我们需要加上synchronize之类保证保证线程安全,这样就降低了程序的效率。

饿汉式:指全局的单例实例在类装载时构建。它的步骤是:
1.私有化构造
2.提供一个私有的静态的最终的本类对象
3.提供public static修饰的get方法获取本类对象
代码演示如下:

/**
 * 单例设计模式:保证一个类有且只有一个对象(实例)
 * 饿汉式:
 */
public class Student {

    //私有化构造函数,不让外界创建对象
    private Student(){}
    
    //提供一个私有的静态的最终的本类对象
    private static final Student student = new Student();
    
    //提供public static修饰的get方法获取本类对象
    public static Student getInstance(){
        return student;
    }
}

懒汉式:缺点是有线程安全问题,多条线程访问有可能产生多个对象,解决方案是加锁。它的步骤是:
1.私有化构造
2.提供一个公共的静态的最终的本类引用
3.提供公共的get方法返回对象, 返回之前判断是否为null
代码演示如下:

/**
 * 单例设计模式
 * 懒汉式:
 */
public class User {

    //私有化构造函数,不让外界创建对象
    private User(){}
    
    //提供一个公共的静态的最终本类引用
    private static User user;
    
    //返回本类对象,在返回之前需要判断对象是否创建
    //需要加锁保证线程安全,锁对象是User.class
    public synchronized static User getInstance(){
        if(user == null){
            user = new User();
        }
        return user;
    }
}

我们还有一种实现单例模式的方式,即程序员式。它的步骤是:
1.私有化构造
2.提供一个公共的静态的最终的本类对象
代码演示如下:

/**
 * 单例设计模式
 * 程序员式:
 */
public class Teacher {

    //私有化构造函数,不让外界创建对象
    private Teacher(){}
    
    //成员变量必须有对象才可以使用
    //提供一个公共的静态的最终的本类对象
    public final static Teacher teacher = new Teacher();

}

我们创建测试类进行测试,代码如下:

public class Test {
    public static void main(String[] args){
    
        //饿汉式
        for (int i = 0; i < 50; i++) {
            System.out.println(Student.getInstance());
        }
        
        //懒汉式
        for (int i = 0; i < 50; i++) {
            System.out.println(User.getInstance());
        }
        
        //程序员式
        for (int i = 0; i < 50; i++) {
            System.out.println(Teacher.teacher);
        }
    }
}

分别打印50次,会发现对象的地址值是相同的。

本文地址:https://blog.csdn.net/weixin_44180753/article/details/107394856

相关标签: java