Bootstrap

Spring中使用到的设计模式(一)----单例模式

单例模式

 

1. 单例模式介绍

 

  • 1.1 简介

保证整个应用中某个实例有且只有一个

 

  • 1.2 意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

  • 1.3 UML图解

我们将创建一个 SingleObject 类。SingleObject 类有它的私有构造函数和本身的一个静态实例。

SingleObject 类提供了一个静态方法,供外界获取它的静态实例。SingletonPatternDemo,我们的演示类使用 SingleObject 类来获取 SingleObject 对象。

 

 

 

  • 1.4 优缺点

优点:

1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

2、避免对资源的多重占用(比如写文件操作)。

缺点:

没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

 

  • 1.5 应用实例

1、一个班级只有一个班主任。

2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。

3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

 

  • 1.6 主要解决的问题

一个全局使用的类频繁地创建与销毁。

 

  • 1.7 应用场景

1、一个班级只有一个班主任。

2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。

3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

 

  • 1.8 注意事项

getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

 

2. 单例模式的实现

 

应用场合:有些对象只需要一个就足够了

作用:保证整个应用程序中某个实例有且只有一个

 

  • 2.1 单例模式的饿汉式实现

 

/*

* 饿汉模式

*/

public class Singleton {

//1.将构造方法私有化,不允许外部直接创建对象

private Singleton(){

}

//2.创建类的唯一实例,使用private static修饰

private static Singleton instance=new Singleton();

//3.提供一个用于获取实例的方法,使用public static修饰

public static Singleton getInstance(){

return instance;

}

}

 

  • 2.2 单例模式的懒汉式实现

/*

* 懒汉模式

*/

public class Singleton2 {

//1.将构造方式私有化,不允许外边直接创建对象

private Singleton2(){

}

//2.声明类的唯一实例,使用private static修饰

private static Singleton2 instance;

//3.提供一个用于获取实例的方法,使用public static修饰

public static Singleton2 getInstance(){

if(instance==null){

instance=new Singleton2();

}

return instance;

}

}

 

3. “饿汉模式”和“懒汉模式”的区别

 

  • 3.1 “饿汉式” pk “懒汉式”

区别:

1.饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全

2.懒汉模式的特点是加载类时比较快,但运行时获取对象的速度比较慢,线程不安全

 

;