在设计模式中,单例模式是最常用的模式之一,它的目的是为了保持对象的唯一性。
单例模式实现的实质就是控制对象的初始化操作(利用此方法可以实现有上限的多例)。其实现方式大致有两种:
一种是被称作饿汉式单例,其写法如下:
publicclass HungryMan {
//生成唯一的对象
privatestaticfinal HungryMan hungryMan = new HungryMan();
//确保不产生第二个对象
private HungryMan(){}
//返回初始化过的对象
publicstatic HungryMan getInstance(){
returnhungryMan;
}
//其他方法
publicvoid doSomething(){}
}
另一种是被称为懒汉式单例,其写法如下:
publicclass Lazybones {
//定义空对象
privatestatic Lazybones lazybones = null;
//确保不产生第二个对象
private Lazybones(){}
//返回初始化过的对象
publicstaticsynchronized LazybonesgetInstance(){
if (lazybones==null) {
//实例化一个对象
lazybones = new Lazybones();
}
returnlazybones;
}
//其他方法
publicvoid doSomething(){}
}
(注:当大量线程同时调用懒汉式写法的单例时,可能会出现多个实例,因为初始化也需要时间,在初始化的时候可能会有多个对象同时是null,从而产生多个对象。即使可以加上synchronized 来防止上述的事情发生但这不是一个好的方法饿汉式单例的写法是相对来说比较好的)
以上两种是只生成唯一的一个对象,也就是唯一性,下面我们利用上面的原理来实现有上限多例,代码如下:
publicclass Emperor {
//最多创建对象的个数
privatestaticintmaxNumOfEmperor = 3;
//创建存放对象的集合
privatestatic ArrayList<Emperor> emperors = newArrayList<Emperor>();
//创建存放对象名字的集合
privatestatic ArrayList<String> nameList = newArrayList<String>();
//存放随机去除的对象的标志
privatestaticintcountNumOfEmperors;
//确保不产生多余的对象
private Emperor(){}
//添加生成对象的名字
private Emperor(String name){
nameList.add(name);
}
//将创建的所有对象放入集合中
static{
for (int i = 0; i < maxNumOfEmperor; i++) {
emperors.add(newEmperor("第"+(i+1)+"个"));
}
}
//返回初始化过的对象
publicstatic Emperor getInstance(){
//获取随机产生的对象
Randomrandom = newRandom();
countNumOfEmperors = random.nextInt(maxNumOfEmperor);
returnemperors.get(countNumOfEmperors);
}
//其他方法
publicvoid doSomething(){
System.out.println("我是"+nameList.get(countNumOfEmperors)+"皇帝");
}
}
此写法是将随机生成的固定个数的对象放入集合中,以此来控制生成对象的个数的上限,又称有上限多例。
(此文章的观点,仅是个人的看法,有不对之处,请多多指教!)