java 单例设计模式 详解

java 单例设计模式

概述:
像Windows系统的任务管理器一样,你无论打开多少次,始终显示的一个窗口。如何保证一个类只有一个实例并且这个实例易于被访问呢,定义一个统一的全局变量可以确保对象随时可以被访问,但不能防止创建多个对象。一个最好的办法就是让类自身负责创建和保存它的唯一实例,并保证不创建其他实例,它还提供了一个访问该实例的方法,这就是单例模式的动机。

单例模式适用场景
单例模式优缺点
优点

  1. 提供了对唯一实例的受控访问。
  2. 在系统内存中只存在一个对象,因此可以节约系统的资源,对于一些需要频繁创建和销毁的对象,使用单例模式无疑是提高了系统的性能。
  3. 单例模式允许可变数目的实例。基于单例模式可以进行扩展,使用与控制单例对象相似的方法获得指定个数的实例对象,既节约了系统资源,又解决了由于单例对象共享过多有损性能的问题(自行提供指定数目实例对象的类可成为多例类)

缺点

  1. 由于单例模式没有抽象层,所以扩展起来很难。
  2. 单例类职责过重,在一定程度上违背了单一职责。因为单例类既提供了业务方法,又提供了创建对象的方法(工厂方法),将对象的创建和对象本身的功能耦合在一起。
  3. 垃圾回收机制,如果实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源。在下次利用时又将重新实例化,这将导致共享单例对象状态丢失。

实现思路

单例设计模式

  • 1.构造方法私有化(防止外部直接new一个新对象)
  • 2.声明一个本类的对象(静态的),(保证对象只有一个)
  • 3.给外部提供一个静态方法获取对象实例

两种方法详解

代码大全:

public class Singleton {
	public static void main(String[] args) {
		// Singleton1 s = new Singleton1();   //构造方法私有化,不能直接new
		Singleton2 s = Singleton2.instance();  //利用静态方法创建对象
		s.print();     //输出  测试方法
		
		Singleton2 s1 = Singleton2.instance();  
		s1.print();     //输出  测试方法
		
		System.out.println(s1==s);  //返回true  说明一共只有一个对象,及单例设计模式!!!
	}
}


//饿汉式
class Singleton1{
	private Singleton1(){}   //构造方法私有化
	static Singleton1 s = new Singleton1(); //声明一个本类的对象 ;饿汉式,太饿了,直接new对象
	public static Singleton1 instance() {   //给外部提供一个静态方法获取对象实例
		return s;
	}
	public void print() {                  //测试方法
		System.out.println("测试方法");	
	}
}


//懒汉式
//在多线程时 有一点小bug,下篇详解
class Singleton2{
	private Singleton2(){}   //构造方法私有化
	static Singleton2 s; // 只是声明一下,没有创建对象
	public static Singleton2 instance() {   //给外部提供一个静态方法获取对象实例
		if (s==null) {
			s = new Singleton2();		//什么时候用到这个方法,再创建对象,生命周期较短
		}
		return s;
	}
	public void print() {                  //测试方法
		System.out.println("测试方法");	
	}
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值