只有一个实例
一、知识概述
Singleton 模式是指,在任何情况下只生成一个实例,且该实例能够在程序上表现出来。该模式仅包含一种角色。
- Singleton:负责实现返回唯一实例的方法。
二、示例程序
以下为实现了Singleton模式的示例程序,这段示例程序的作用是,从外部获取唯一实例,并进行验证。
类图示例
程序清单
/**
* 只存在一个实例的类
*/
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
System.out.println("生成了一个实例");
}
public static Singleton getInstance() {
return singleton;
}
}
/**
* 测试程序行为的类 验证任何情况下只生成一个实例
*/
public class Main {
public static void main(String[] args) {
System.out.println("Start.");
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if (obj1 == obj2) {
System.out.println("obj1与obj2是相同的实例");
} else {
System.out.println("obj1与obj2是不同的实例");
}
System.out.println("End.");
}
}
三、课后习题
习题1:
修改以下代码,确保只能生成一个该类的实例
public class TicketMaker {
private int ticket = 1000;
public int getNextTicketNumber() {
return ticket++;
}
}
回答1:
public class TicketMaker {
private static TicketMaker maker = new TicketMaker();
public static getInstance() {
return maker;
}
private int ticket = 1000;
private TicketNumber() {
}
public synchronized int getNextTicketNumber() {
return ticket++;
}
}
习题2:
编写Triple类,实现最多只能生成3个Triple类的实例,实例编号1,2,3,且可以通过getInstance(int id) 来获取该编号对应的实例
回答2:
public class Triple {
private static Triple[] triples = new Triple[] {
new Triple(0),
new Triple(1),
new Triple(2),
};
public static Triple getInstance(int id) {
return triples[id];
}
// 限制可见性
private Triple() {
}
}
习题3:
某研发人员编写了如下的Singleton类,但这并非严格的Singleton模式。why?
public class Singleton {
// 限制可见性
private Singeton() {
System.out.println("生成了一个实例");
}
private static Singleton singleton = null;
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
回答3:
这是因为在多个线程在同时调用getInstance方法时,可能会生成多个实例。