黑马程序员—单例模式的设计

本文介绍了Java设计模式中的单例模式,旨在确保一个类只有一个实例,并提供全局访问点。讨论了单例模式的实现,包括私有构造函数、类内创建对象以及静态方法获取对象。提到了懒汉式单例在多线程环境下的安全问题,以及通过双重检查锁定(DCL)解决这一问题的方式。最后指出,尽管懒汉式考虑了性能,但在实际开发中,饿汉式由于其线程安全性通常更受欢迎。

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



设计模式:所谓模式即解决某一类问题最行之有效的解决方案,在JAVA中有23种设计模式,分别为:

 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。

 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。

 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、模式、访问者模式。
单例设计模式:保证一个类的实例可以有且只可以有一个,
                        即保证一个类在内存中只存在一个对象,避免其他程序过多建立对象
 
解决思路:
1.先禁止其他程序建立该类对象
2.在本类中自定义一个对象
3.对外提供访问方式

代码实现:
1.将构造函数私有化
2.在类中创建一个本类对象
3.提供一个方法可以获取该对象,
     注:既然不能在其他类创建该类的对象,所以只能在本类中创建本类对象,

            即对于对外提供获取该对象的方法调用两种途径:1.对象;2.类名;只能选择用类名调用,
            所以该方法应为static修饰,同理静态方法访问的类内部成员也应为静态。

class Single
{
	private Single(){}
	private static Single s = new Single();
	public static Single getInstance()
	{
		return s;
	}
}
class SingleDemo
{
	public static void main(String[] args)
	{
		Single s = Single.getInstance();
	}
}


---------------------------------------------------------
----------------------------------------------------------
用以下测试程序验证:

class Single
{
	private int num;
	public void setNum(int num)
	{	
		this.num = num;
	}
	public int getNum()
	{
		return num;
	}
	private Single(){}
	private static Single s = new Single();//先初始化对象,称为饿汉式
	public static Single getInstance()
	{
		return s;
	}
}
class SingleDemo
{
	public static void main(String[] args)
	{
		Single s1 = Single.getInstance();
		Single s2 = Single.getInstance();
		s1.setNum(23);
		System.out.print(s2.getNum());
	}
}
输出结果为:23,即由于使用单例模式,所以s1和s2指向同一个堆内存中的对象。

这种设计单例模式Single类一进内存,就在堆内存中创建对象
,所以称之为饿汉式

单例另一种形式:
class Single
{
	private static Single s = null;
	private Single(){}
	public static Single getInstance()
	{
		if(s == null)
			s = new Single();
		return s;
	}
}


这种单例设计模式在getInstance()方法被调用才进行对象初始化,即对象延时加载,所以称之为懒汉式

懒汉式
在多线程中存在的安全问题,即当A程序执行完 if(s == null) 判断后,切换到另一个线程,则调用该方法的B程序此时将创建一个Single对象,

当A程序再次获得CPU的执行权时,不再进行if(s == null) 判断就直接创建该类对象!!

单例模式的第三种形式:

<pre name="code" class="java">class Single
{
	private static Single s = null;
	private Single(){}
	public static Single getInstance()
	{
		if(s == null)
			synchronized(Single.class)
			{
				if(s==null)
					s = new Single();
			}
		return s;
	}
}




双重锁形式,加了synchronized关键字,即解决了多线程情况下的安全问题,又由于采用双重判断方式避免了直接将synchronized加在方法名上所导致的低效问题,public static synchronized Single getInstance()。

小结:实际开发一般用饿汉式,虽然类一加载就创建对象,但是单例模式的设计就是为了保证对象的唯一性,
          也就是说就是需要用到这个类的实例对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值