Java 单例模式

本文介绍了Java中的单例模式,包括单例模式的概念、实现步骤和两种模式:饿汉模式与懒汉模式。饿汉模式在类加载时就创建实例,而懒汉模式在首次调用时创建,需要注意多线程同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正常情况下,一个类可以创建多个对象

public class Person {

    public Person(){}

    public static final Person p = new Person();

    public static Person getInstance(){
        return p;
    }
}


public class Test {
    public static void main (String[] args) {

        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = new Person();
        Person p4 = new Person();
        Person p5 = new Person();

    }
}

有时候,某些类【Person】,我们希望只能创建单一的一个对象,这个时候就需要使用单例模式

单例模式:

        概述:是一种常用的软件设计模式
        通过单例模式可以保证系统中,应用该模式的这个类只有一个实例,也就是该类仅有一个对象实例

        步骤:

        1.将构造方法私有化,让其不能在类的外部通过new的方式实例化该类对象
        2.在该类内部产生一个唯一的实例对象
        3.定义一个静态方法返回这个唯一的对象

public class Person {
    //1.将构造方法私有化,让其不能在类的外部通过new的方式实例化该类对象
    private Person(){}

    //2.在该类内部产生一个唯一的实例对象
    private static final Person p = new Person();

    //3.定义一个静态方法返回这个唯一的对象
    public static Person getInstance(){
        return p;
    }
}



public class Test {
    public static void main (String[] args) {

        Person p1 = Person.getInstance();
        Person p2 = Person.getInstance();
        Person p3 = Person.getInstance();
        Person p4 = Person.getInstance();
        Person p5 = Person.getInstance();

    }
}

单例模式(饿汉模式、懒汉模式)

        根据实例化对象的【时机】,单例模式又分为两种设计模式

        【饿汉模式】和【懒汉模式】

【饿汉模式】

        我们当前这种Person类的设计模式属于饿汉单例模式
        饿汉单例模式就是在使用类的时候已经将对象创建完毕
        不管以后会不会使用到该实例对象
        我先创建了再说
        看起来很着急的样子,所以称之为【饿汉模式】

        上面的例子就是饿汉模式

【懒汉模式】

         Student类设计成【懒汉式】单例模式
        懒汉单例模式,就是在调用getInstance方法的时候
        实例才会被创建,不着急实例化对象
        等到需要用的时候才实例化对象
        因为它不着急,用到时候才创建,故称之为【懒汉式】单例模式

public class Student {
    // 1.将构造方法私有化,让其不能在类的外部通过new的方式实例化该类对象
    private Student(){}

    // 2.在该类内部产生唯一的实例对象
    private static Student s;//默认值就是null

    // 3.定义一个静态方法返回这个唯一的对象
    public static  synchronized Student getInstance(){
        //创建Student唯一的对象
        //判断一下,如果s这个成员变量为null的化,就创建,不为null,就不创建
        if(s == null){
            s = new Student();
        }
        return s;
    }
}


public class Test {
    public static void main (String[] args) {

        Student s1 = Student.getInstance();
        Student s2 = Student.getInstance();
    }
}

        这里需要注意的一个问题:
            因为懒汉单例模式在调用方法时才会创建对象
            所以当有多个地方同一个时间调用该方法获取对象的化
            意思就是说在多线程情况下可能会出现实例化多个对象出来
            为了保证单例的状态,需要加上一把锁,使其能够保证同步运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值