《java与模式》笔记(十一) 单例模式

☆ 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。

§ 15.1 引言
☆ 一些资源管理器常常设计为单例模式,比如打印管理器、传真管理器、通讯端口管理器或者一些管理内部资源如配置文件管理器等。

☆ Windows的回收站是一个很好的单例的实际例子。

§ 15.2 单例模式的结构
☆ 单例模式的特点:
① 单例类只能有一个实例;
② 单例类必须自己创建自己的唯一实例;
③ 单例类必须给所有其他对象提供这一实例。

☆ 饿汉式单例类

public   class  EagerSingleton
{
    
/**
     * 所谓饿汉式单例,就是直接在声明处实例化自身实例
     
*/

    
private static final EagerSingleton _instance = new EagerSingleton() ;
    
    
/**
     * 私有构造函数,确保类不会被其他客户端实例化。
     
*/

    
private EagerSingleton() {}
    
    
/**
     * 像整个应用提供唯一的实例。
     
*/

    
public static EagerSingleton getInstance()
    
{
        
return _instance ;
    }

}

☆ 懒汉式单例类

public   class  LazySingleton
{
    
/**
     * 注意,懒汉式单例并没有在声明处实例化自身的实例。
     
*/

    
private static LazySingleton _instance = null ;
    
    
/**
     * 私有构造函数。
     
*/

    
private LazySingleton() {}
    
    
/**
     * 取得实例的方法,懒汉式单例在取得实例的方法里面去实例化自身。
     * 注意,该方法应加线程锁,防止多线程环境下实例检测混乱。
     
*/

    
synchronized public static LazySingleton getInstance()
    
{
        
ifnull == _instance )
            _instance 
= new LazySingleton() ;
        
        
return _instance ;
    }

}

§ 15.4 单例类的状态
☆ 单例类中可以存在一些标识当前状态的属性,这个时候单例类就是有状态的,反之就是无状态的单例类。有状态的单例类常常用来当作状态库使用。

有状态的单例类实现起来要注意几点,一是设计的时候要考虑到多线程修改状态的问题,必要的地方加线程锁;二是在如EJB这样的多JVM技术框架,或者同一个JVM中有多个类加载器的情况下,尽量避免使用有状态的单例实现。

无状态的单例实现通常应该设计成不变类。

§ 15.5 Java语言中的单例模式
本节举java.lang.Runtime例,说明jkd中的单例应用。
比较有用的就是用Runtime.getRuntime().exec()来执行外部命令。

§ 15.7 不完全单例类

public   class  LazySingleton
{
    
/**
     * 注意,懒汉式单例并没有在声明处实例化自身的实例。
     
*/

    
private static LazySingleton _instance = null ;
    
    
/**
     * 公有的构造函数,可以直接实例化。
     
*/

    
public LazySingleton() {}
    
    
/**
     * 取得实例的方法,懒汉式单例在取得实例的方法里面去实例化自身。
     * 注意,该方法应加线程锁,防止多线程环境下实例检测失败。
     
*/

    
synchronized public static LazySingleton getInstance()
    
{
        
ifnull == _instance )
            _instance 
= new LazySingleton() ;
        
        
return _instance ;
    }

}

也叫默认实例模式,用户可以选择自己生成实例,也可以选择通过工厂方法得到的共享实例。这样等于把选择实例化方式的责任交给客户端,很难保证客户端正确使用该类。不建议作出这样的设计。

§ 15.8 相关模式
和单例模式关系最大的莫过于多例模式和简单工厂模式,不多写了。

☆ 最后一节以大量的篇幅说明“双重检测成例”在java下行不通,觉得有点无聊。
☆ 书中的登记式单例实现,怎么看怎么是个不完全单例,所以没有细研究。不知道是GOF当初就这么实现的还是让这老仙给改成这样的,有点乱七八糟。
☆ 总结一下,本章最有用的知识点:
一是单例的特点;
二是懒汉和饿汉两种单例的实现,其中懒汉式单例要注意多线程问题;
三是有状态单例严格禁止在分布式应用中使用;
四是不要作出所谓的“不完全单例”设计;
五是双重检查成例不要用java写。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值