Header First设计模式学习笔记——单例模式

问题引入

        有时候对于有些对象,我们只需要一个,多了反而会出现很多问题。比如:线程池,缓存,处理器偏好设置,日志对象等等(可能导致程序异常,内存泄露)。

模式定义

        确保一个类只有一个实例,并提供一个全局访问点。

认识模式

        确实我们可以通过程序员之间的约定保证一个类只有一个对象,但是通过使用单例模式效果更好,更安全。

问题解决

       创建单例模式类步骤:   

         * 1、构造一个私有的静态变量;

         * 2、构造函数私有化,避免外部直接创建对象;

         * 3、创建一个公有的静态方法,返回该变量,如果该变量为空,创建该对象。

直接上代码:

package my.oschina.net.design.singleton;

class SingleTon
{
	private static SingleTon instance = null;
	
	private SingleTon(){}

	public static SingleTon getInsatnce()
	{	
		if(null == instance)
			instance = new SingleTon();			
		return instance;
	}		
}

这是一个经典的单例模式代码,但是它本身是有问题的,在多线程的情况下,可能会出现多个对象。于是我们做如下的改进

class SingleTon
{
	private static SingleTon instance = null;
	
	private SingleTon(){}

	public static synchronized SingleTon getInsatnce()
	{	
		if(null == instance)
			instance = new SingleTon();	
		
		return instance;
	}		
}

我们给这个方法加上同步机制,这样就不存在多线程的问题了,但是新的问题来了,实际上只有在第一次执行这个方法的时候才需要同步,以后实际上就不需要同步。但是这样写代码,我们每调用一次都需要同步,这显然是很费时费事的。于是我们再进行改进。

class SingleTon {
    private static SingleTon instance = null;
    
    private SingleTon() {}
    
    public static SingleTon getInstance() {
        if (null == instance ) {
            synchronized (SingleTon.class) {
                if (null == instance) {
                	SingleTon = new Siglenton();
                }
            }
        }
        return instance ;
    }
}

这个就好多了,我们称这个为双重检查(DOUBLE-CHECKED),我们先检查对象是否已经创建,如果没有创建我们在进行同步,这样一来只有第一次会同步,刚好符合我们的要求。


上面所说的我们都称他为“懒汉模式”,我们延迟了对象的实例化,下面我们看看所谓的"饿汉模式”

class Singleton {  
    private static Singleton instance= new Singleton();  
    //可以保证线程安全
    private Singleton() {}  
    
    public static Singleton getInstance() {  
        return instance;  
    }  
}


还有一种使用静态内部类的方法

public class Singleton {  
    private static class SingletonHolder {  
        private static final Singleton instance= new Singleton();  
    }  
    
    private Singleton() {} 
     
    public static final Singleton getInstance() {  
        return SingletonHolder.instance;  
    }  
}


转载于:https://my.oschina.net/v5871314/blog/268858

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值