单例模式案例
模式定义于动机
单例模式是一种对象创建型模式,它确保某一个类中只有一个实例,而且自行实例化并向系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
三个要点:
- 某个类只能有一个实例
- 它必须自行创建这个实例
- 它必须自行向整个系统提供这个实例
模式结构的角色
单例角色类(Singleton)
内容
- 提供一个自身的静态私有成员变量(单例类对象)
- 提供一个公有静态方法getInstance(),使用户可以获取该实例
- 构造函数私有化,防止在外部对该类实例化
单例模式分类(饿、懒)
饿汉式和懒汉式代码中的区别是:初始化单例对象的位置不同
- 饿汉式:在声明的时候 就初始化
(不管用不用这个单例对象,这个单例对象都初始化好了,所以显得着急,称为“饿”)
public class PrintSpoolerSingleTon2 {
private static PrintSpoolerSingleTon2 instance
= new PrintSpoolerSingleTon2();
private PrintSpoolerSingleTon2(){}
public static PrintSpoolerSingleTon2 getInstance(){
return instance;
}
}
- 懒汉式:在获取单例对象时进行判断,若没有该对象为null,则初始化,若该对象存在,则直接返回
(用的时候才初始化)
public class PrintSpoolerSingleton {
private static PrintSpoolerSingleton instance = null;
private PrintSpoolerSingleton() {
}
public static PrintSpoolerSingleton getInstance() {
if (instance == null) {
System.out.println("创建打印池");
instance = new PrintSpoolerSingleton();
} else {
throw new PrintSpoolerException("打印池正在使用中");
}
return instance;
}
}
实现多例模式的案例
案例背景
在实际的运用中,我们有时一个类不止需要产生一个对象,可能需要两个或者三个。使用单例模式的思想可以实现多例模式,从而确保系统中某个类的对象只能存在有限个,请设计并实现代码,从而实现多例模式
代码实现
文件结构或类图
1. 饿汉式单例类
class Mutation_ {
private static Mutation_[] array = {new Mutation_(), new Mutation_(), new Mutation_()};
private Mutation_() {
}
public static Mutation_ getInstance(int n) {
if (n == 0 || n == 1 || n == 2) {
return array[n];
} else {
throw new RuntimeException("没有下标为" + n + "的对象");
}
}
}
2. 懒汉式单例类
/**
* @author 王胖子
* @version 1.0
*/
class Mutation_ {
private static Mutation_[] array;
private Mutation_() {
}
public static Mutation_ getInstance(int n) {
if (n == 0 || n == 1 || n == 2) {
//如果数组为空,就初始化数组
if (array == null) {
array = new Mutation_[3];
}
//如果数组中的对象为空,则创建对象
if (array[n] == null) {
System.out.println("创建下标为" + n + "的对象");
array[n] = new Mutation_();
} else {
throw new RuntimeException("下标为" + n + "的对象正在使用中");
}
return array[n];
} else {
throw new RuntimeException("没有下标为" + n + "的对象");
}
}
}
3. 客户类
/**
* @author 王胖子
* @version 1.0
*/
public class Client {
public static void main(String[] args) {
try {
Mutation_ multi1 = Mutation_.getInstance(0);
Mutation_ multi2 = Mutation_.getInstance(0);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
输出结果
模式适用环境
单例模式主要适用于:
- 系统只需要一个实例对象,或者因为资源消耗太大而只允许创建一个对象
- 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例
- 根据不同的需求,也可以按照单例模式的思想来实现多例模式