单例设计模式饿汉式和懒汉式的简单实现(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一个对象。
懒汉式的优缺点
- 优点:需要的时候才创建,延迟对象的创建
- 但目前的懒汉式的实现是非线程安全的,需要完善。