单例模式

简介:
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。
许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

概述
定义一个统一的全局变量可以确保对象随时可以被访问,但不能防止创建多个对象。 一个最好的办法就是让类自身负责创建和保存它的唯一实例,并保证不创建其他实例,它还提供了一个访问该实例的方法,这就是单例模式的动机。

基本实现思路:
单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。

单例的实现主要是通过以下两个步骤:
将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;
在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。
1.懒汉式(这里的懒是指不在类一加载时就创建实例,而是在使用该实例时再创建实例):

public class Singleton1 {
//私有构造,类只能在类内部创建
private Singleton() {
}
//私有变量保存实例,外界不能直接获取,只能通过提供的公共方法获取。
private static Singleton1 singleton1 = null;
public static synchronized Singleton1 getInstance() {
	if(singleton1 == null) {
	singleton1 = new Singleton1();
}
return singleton1;
}
}

2.饿汉式单例模式(这里的饿是指在加载类的时候就会创建类的单例,并保存在类中。):

public class Singleton2 {
	//私有构造
	private Singleton2(){};
	
	//私有变量,保存类实例,并在类一加载时就实例化,保存在变量中;
	
	private static Singleton2 singleton2 = new Singleton2();
	
	//提供公共的方法方法获取实例
	
	public static Singleton2 getInstance() {
		return singleton2;
	}
}

3.类级内部类方法:

(饿汉式会占用较多的空间,因为其在类加载时就会完成实例化,

  • 而懒汉式又存在执行速率慢的情况,双重加锁机制呢?又有执行效率差的毛病, *
    有没有一种完美的方式可以规避这些毛病呢?貌似有的,就是使用类级内部类结 * 合多线程默认同步锁,同时实现延迟加载和线程安全。)
public class Singleton3 {
	private Singleton3(){};
	
	private static class SingletonBuilder {
		private static final Singleton3 singleton3 = new Singleton3();
	}
	public static final Singleton3 getInstance() {
		return SingletonBuilder.singleton3;
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值