package com.cheng.zenofdesignpatterns.patterns.singleton; import java.util.ArrayList; import java.util.Random; /** * 固定数量的皇帝类 */ public class Emperor { // 定义最多能产生的实例数量 private static int maxNumOfEmperor = 2; // 每个皇帝都有名字,使用一个ArrayList来容纳,每个对象的私有属性 private static ArrayList<String> nameList = new ArrayList<>(); // 定义一个列表,容纳所有的皇帝实例 private static ArrayList<Emperor> emperorList = new ArrayList<>(); // 当前皇帝序列号 private static int countNumOfEmperor = 0; // 产生所有的对象 static { for (int i = 0; i < maxNumOfEmperor; i++) { emperorList.add(new Emperor("皇"+(i+1)+"帝")); } } private Emperor() { // 世俗和道德约束你,目的就是不产生第二个皇帝 } // 传入皇帝名称,建立一个皇帝对象 private Emperor(String _name) { nameList.add(_name); } // 随机获取一个皇帝对象 public static Emperor getInstance() { Random random = new Random(); // 随机拉出一个皇帝,只要是个精神领袖就成 countNumOfEmperor = random.nextInt(maxNumOfEmperor); return emperorList.get(countNumOfEmperor); } // 皇帝发话了 public void say() { System.out.println(nameList.get(countNumOfEmperor)); } /** * 这种需要生成固定数量对象的模式就叫做有上限的多例模式,它是单例模式的一种扩展, * 采用有上限的多例模式,我们可以在设计时决定在内存中有多少个实例,方便系统进行 * 扩展,修正单例可能存在的性能问题,提高系统的响应速度。例如读取文件,我们可以 * 在系统启动时完成初始化工作,在内存中启动固定数量的reader实例,然后在需要读取 * 文件时就可以快速响应 */ }