概念:
单例模式:确保一个类只有一个实例化对象。即就是一个系统中只有一个实体对象。
在单例模式中又分为两种模式:饿汉式单例和懒汉式单例。
饿汉式单例:在类加载的时候初始化实例。
懒汉式单例:在第一次引用的时候初始化实例。
实现:
饿汉式单例:数据库
1 public class HungrySingleCase { 2 //私有化构造方法 3 private HungrySingleCase(){} 4 //在内部实例化对象,静态保证了在该类家在的时候会执行一次,且仅执行一次。一样私有化是咱们一般习惯暴露get方法对外提供访问。 5 private static HungrySingleCase singleCase = new HungrySingleCase(); 6 //提供get方法 7 public static HungrySingleCase getSingleCase(){ 8 return singleCase; 9 } 10 }
懒汉式单例:多线程
1 public class SluggardSingleCase { 2 //私有化:不容许外部new该对象 3 private SluggardSingleCase(){} 4 //私有:习惯上咱们只提供get方法访问对象。静态:加载但咱们并不初始化,由于咱们须要它在第一次引用时实例化,而不是类加载时实例化。 5 private static SluggardSingleCase sluggardSingleCase = null; 6 //添加同步,防止在第一次引用时多线程并发,可能会出现多个实例对象。提供get方法。 7 synchronized public static SluggardSingleCase getSingleCase(){ 8 //判断该对象是否为null,本质是判断否第一次引用 9 if (sluggardSingleCase == null){ 10 sluggardSingleCase = new SluggardSingleCase(); 11 } 12 return sluggardSingleCase; 13 } 14 }
分析:上面的实现中,我也尽量的简单明了的写了注释,接下里咱们更详细的分析一下单例模式。
1.单例就必然得私有化构造方法,其中提供的get方法必然是静态的,那么它所用的变量或者别的方法也必然是静态的。
2.饿汉式单例是使用语言特性实现的单例模式,懒汉式单例主要是经过咱们书写逻辑实现的单例模式。
3.从实现上分析,饿汉式比懒汉式更占用内存资源。懒汉式比饿汉式更占用CPU资源。
4.不管是哪一种模式的单例,由于都是静态的缘由,因此不管是它有父类或者有子类,就单例模式下都是没有意义的。因此也就基本不存在扩展。
5.单例当然整个系统中就只有一个,并且通常对于工具类或者可共享的都是整个系统就一个,能够免去不少比必要的建立对象和销毁对象,从而提高系统性能。
6.适合单例的场景:
a.整个系统中只须要一个
b.建立对象须要的资源比较多,对象并不要求每次都是新对象。如IO对象或数据库访问对象。
c.须要定义大量静态的工具类,或者自己工具类就也能够设计成单例。
……
经典框架中使用的:
Spring框架中,管理Bean,默认生成的对象就是以单例模式生成;Struts2框架中,工厂对象基本都是使用单例模式生成。等等……
并发