单例模式主要用于某个类在程序中只需要生成一个实例的情况。比如有一个实现服务器管理和请求分配的 负载均衡类,如果可以创建多个实例的话将造成服务器状态的不一致以及请求分配冲突。所以我们不应该让外面的程序随随便便就能new一个实例。此时我们就可以通过单例模式解决这一问题了。
以负载均衡类为例基本的单例模式编程方法如下:
import java.util.*;
//负载均衡器LoadBalancer:单例类,真实环境下该类将非常复杂,包括大量初始化的工作和业务方法,考虑到代码的可读性和易理解性,只列出部分与模式相关的核心代码
class LoadBalancer {
//私有静态成员变量,存储唯一实例
<span style="background-color: rgb(255, 0, 0);">private static LoadBalancer instance = null;</span>
//服务器集合
private List serverList = null;
//私有构造函数
<span style="background-color: rgb(255, 0, 0);">private</span> LoadBalancer() {
serverList = new ArrayList();
}
//公有静态成员方法,返回唯一实例
<span style="background-color: rgb(255, 0, 0);">public static LoadBalancer getLoadBalancer() {
if (instance == null) { //如果未创建实例则创建,若已创建则直接返回
instance = new LoadBalancer();
}
return instance;
}</span>
//增加服务器
public void addServer(String server) {
serverList.add(server);
}
//删除服务器
public void removeServer(String server) {
serverList.remove(server);
}
//使用Random类随机获取服务器
public String getServer() {
Random random = new Random();
int i = random.nextInt(serverList.size());
return (String)serverList.get(i);
}
}
注意代码中标红的地方,首先我们将构造函数定义为私有函数,这样在类外就无法创建类的实例了。既然无法在类外创建,那我们只能在类里面创建实例了。可能有人就要问了,在类外你都无法new一个实例,如何调用类中的方法创建实例呢。其实只需要将方法和变量定义成静态的就可以了。静态成员变量和静态成员方法存放在静态域且在类加载时就被初始化了,故在未实例化类的情况下也可以调用共有静态成员方法。