多例模式:
类可以存在有限的多个实例对象。
多例模式的特点
- 通过容器保存实例对象
- 利用私有构造器阻止外部创建对象
- 通过getInstance方法获取实例对象
代码演示
创建两个机器人对象:
package com.company.section5;
import java.util.HashMap;
import java.util.Random;
/**
* 机器人
*
* @author zhangdongping
*/
public class Droid {
/**
* 机器人容器,生产出来的机器人都放在这里面
*/
private static HashMap<String, Droid> droids = new HashMap<>();
/**
* 为机器人选了两个名字,一个叫“阿尔法狗”,另一个叫“深蓝”
*/
public static final String[] names = {"阿尔法狗", "深蓝" };
/**
* 机器人应该有自己名字
*/
private String name;
/**
* 直接制造两个机器人,放入机器人容器
*/
static {
// 第一个机器人是阿尔法狗
Droid alphaGo = new Droid(names[0]);
droids.put(names[0], alphaGo);
// 第二个机器人是深蓝
Droid master = new Droid(names[1]);
droids.put(names[1], master);
}
/**
* 构造机器人的时候,应该取好名字<br/>
* 私有构造函数,在外部无法进行构造
*
* @param name
*/
private Droid(String name) {
this.name = name;
}
/**
* 随便抓一个机器人,无论是谁,是机器人就行。
*
* @return
*/
public static Droid getRandomInstance() {
Random random = new Random();
int index = random.nextInt(2);
String name = names[index];
return droids.get(name);
}
/**
* 叫机器人的名字,找到和名字匹配的那个机器人
*
* @param name
* @return
*/
public static Droid getInstance(String name) {
return droids.get(name);
}
/**
* 机器人有一个应答功能,会报告自己名字。
*/
public void reply() {
System.out.println("I am " + name + ", I'm here.");
}
}
创建测试类
package com.company.section5;
/**
* 对机器人进行点名
*
* @author zhangdongping
*/
public class Call {
public static void main(String[] args) {
// 随便抓机器人,抓6次,每抓一个机器人出来,就让它报自己的名字
for (int i = 0; i < 6; i++) {
Droid droid = Droid.getRandomInstance();
droid.reply();
}
System.out.println("");
System.out.println("=====华丽丽的分隔符=====");
System.out.println("");
// 找到阿尔法狗,让它报道
Droid alphaGo = Droid.getInstance(Droid.names[0]);
alphaGo.reply();
// 找到深蓝,让它报道
Droid master = Droid.getInstance(Droid.names[1]);
master.reply();
}
}