一. 定义:
单例模式:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
初始化时实例化
构造函数设置为私有访问权限,禁止外部创建对象
其他类对该类的访问都可以通过getinstance获得同一个对象
二. 单例模式优缺点:
单例模式的优点:
-- 由于单例模式在内存中只有一个实例,减少了开支,特别是一个对象需要频繁地创建销毁时性能又无法优化时;
-- 减少性能开销。当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,可通过在应用启动时直接产生一个单例对象,然后永久驻留在内存的方式来解决;
-- 单例对象可以避免对资源的多重占用。(避免对同一个资源文件的同时写操作);
-- 可以在系统设置全局访问点,优化和共享资源访问。
缺点:
-- 单例模式一般没有接口,扩展很困难;
-- 单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟一个对象;
-- 单例模式与单一职责原则有冲突。一个类应该只是实现一个逻辑,而不关心它是否是单例的。
三. 状态模式的使用场景及注意事项
1.使用场景:
要求生成唯一序列号的环境;
在整个项目中需要一个共享访问点或共享数据;
创建一个对象需要消耗的资源过多,如要访问io和数据库等资源;
需要定义大量的静态常量和静态方法(如工具类)的环境。
spring中的bean默认就是单例。这样做spring容器可以管理这些bean的生命周期,决定这些bean的创建、销毁等。
2.注意事项:
高并发情况下,注意单例模式的线程同步问题。