单例设计模式饿汉式和懒汉式的简单实现(Java语言实现)

本文介绍了Java中的单例设计模式,包括饿汉式和懒汉式两种实现方式。饿汉式在类加载时就创建了唯一对象,线程安全但可能浪费资源;懒汉式则在首次使用时创建对象,实现了延迟加载,但非线程安全。文章通过代码示例详细解释了两种模式的实现细节和优缺点。
摘要由CSDN通过智能技术生成

单例设计模式饿汉式和懒汉式的简单实现(Java语言实现)


单例设计模式介绍

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

实现原理:
要使类只能产生一个对象,首先,我们必须将类的构造器的访问权限设置为 private,,这样我们就不能通过new关键字在外部多次创建对象了,但在类的内部我们仍可以产生该类的对象

因为在外部无法得到类的对象,我们只能提供一个 static关键字修饰过的静态方法来提供访问类内部创建的对象,而由于静态方法只能访问类中的静态变量,所以我们内部的对象也必须定义成静态的(有关static关键字和静态方法的概念可以康康我的另一篇文章Java中static关键字的使用)

说起来就这么点东西了,接下来看看单例设计模式的两种实现方式。


饿汉式单例模式

饿汉式单例模式介绍

顾名思义,饿汉式就是很饿,所以我们不管三七二十一,就把我们需要的那一个唯一的对象直接产生出来,然后加以封装并提供调用的方法

代码实现

我们一步一步来,首先有一个叫Bank的类

public class Bank {
}

按照上面说的,我们需要一个private的构造器

public class Bank {
	//private权限的构造器
	private Bank() {
    }
}

接着我们自己内部产生一个唯一的静态对象

public class Bank {
        //private权限的构造器
        private Bank() {
        }
        //Bank的内部直接new一个Bank类的对象instance
        private static Bank instance = new Bank();
        //这个instance可以理解为Bank类的属性之一了
}

因为这个静态变量是外部无法访问的,所以我们需要提供一个公开的方法来供外部使用instance变量

public class Bank {
        //private权限的构造器
        private Bank() {
        }
        //Bank的内部直接new一个Bank类的对象instance
        //这个instance可以理解为Bank类的属性之一了
        private static Bank instance = new Bank();
        //提供一个public的方法来返回instance对象
        public static Bank getInstance(){
            return instance;//返回instance对象
        }
}

其实到这里一个简单的饿汉式单例设计模式就写完了,我们测试一下

public class SingletonTest {
    public static void main(String[] args) {
        Bank bank1=new Bank();//无法new对象,因为没有权限
        bank1.getInstance;//更不用说通过对象调用方法了
    }
}

我们只能直接通过类中我们提供的方法来查看内部对象

public class SingletonTest {
    public static void main(String[] args) {
        System.out.println(Bank.getInstance());
    }
}

运行结果:成功返回了对象的地址值

在这里插入图片描述

饿汉式的优缺点

  • 优点:饿汉式是线程安全的
  • 缺点:如果没有第一时间使用,可能会浪费资源

懒汉式单例模式

懒汉式单例模式介绍

顾名思义,因为是懒汉式,所以很懒,只有在需要的时候才去动,及产生对象。

代码实现

因为相较于饿汉式差异不大,所以直接放上全代码

public class Bank {
        //private权限的构造器
        private Bank() {
        }
        //类内部声明了一个Bank变量,但并没有new对象
        private static Bank instance = null;
		//提供外部使用的方法,第一次调用时若发现instance并不存在则new
		//一个对象后再返回
        public static Bank getInstance(){
            if(instance == null){
                instance = new Bank();
            }
            //当存在后,直接返回.
            return instance;
        }

}

懒汉式和饿汉式的唯一区别就在于,懒汉式在生成内部对象时,并没有一开始就分配空间,而是等第一次真正使用时,才会去new一个对象。

懒汉式的优缺点

  • 优点:需要的时候才创建,延迟对象的创建
  • 但目前的懒汉式的实现是非线程安全的,需要完善。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值