1.单例模式
1.1.引言:据我了解,单例模式应该属于java设计模式中较为简单的一个设计模式,作为设计模式的开篇,先从简单入手,来慢慢理解设计模式。
1.2.定义:单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。
2.单例模式的特点:
2.1.类始终只能有一个实例。
2.2.创建对象的操作需要由本类来完成。
2.3.该类必须向外界暴漏一个能够访问该类实例的接口(方法).
3.创建单例模式的要点:
3.1.私有构造方法。
3.2.指向自己实例的私有静态引用。
3.3.以自己实例为返回值的公有接口(方法)。
4.分类:
4.1.饿汉式单例: 饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用。
4.1.1.代码实例:HSingleTon.java
1 package com.cn.singleton; 2 /** 3 * 饿汉式单例类 4 * @author Administrator 5 * 6 */ 7 public class HSingleTon { 8 private static HSingleTon singleton = new HSingleTon(); 9 private HSingleTon(){} 10 public static HSingleTon getInstance(){ 11 return singleton; 12 } 13 }
4.2.懒汉式单例:懒汉式单例是在调用取得实例方法的时候实例化对象。
4.2.1.代码实现:LSingleTon.java
1 package com.cn.singleton; 2 /** 3 * 懒汉式单例模式 4 * @author Administrator 5 * 6 */ 7 public class LSingleTon { 8 private static LSingleTon singleton; 9 private LSingleTon(){} 10 public static synchronized LSingleTon getInstance(){ 11 if (singleton == null) 12 singleton = new LSingleTon(); 13 return singleton; 14 } 15 }
4.3.双重锁模式:这个模式将同步内容写到了if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了
4.3.1.代码实现:DLSingleTon.java
1 package com.cn.singleton; 2 /** 3 * 双重锁模式单例 4 * @author Administrator 5 * 6 */ 7 public class DLSingleTon { 8 private static DLSingleTon singleton; 9 private DLSingleTon(){} 10 public static DLSingleTon getInstance(){ 11 if (singleton == null){ 12 synchronized (DLSingleTon.class) { 13 if (singleton == null) 14 singleton = new DLSingleTon(); 15 } 16 } 17 return singleton; 18 } 19 }
5.优缺点:
5.1.优点:
a.在内存中只有一个对象,节省内存空间。
b.避免频繁的创建销毁对象,可以提高性能。
c.避免对共享资源的多重占用。
d.可以全局访问。
5.2.缺点:
a.扩展困难,由于getInstance静态函数没有办法生成子类的实例。如果要拓展,只有重写那个类。
b.隐式使用引起类结构不清晰。
c.导致程序内存泄露的问题。
6.适用场景:
a.需要频繁实例化然后销毁的对象。
b.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
c.资源共享的情况下,避免由于资源操作时导致的性能或损耗等
d.控制资源的情况下,方便资源之间的互相通信。