package designModel.singleModel;
public class SingleClass {
private static final SingleClass singleClass = new SingleClass();
//限制产生多个对象,final修饰变量不能别改变
public SingleClass() {
// 创建了一个singleClass的无参造器,默认是有一个无参的构造器
}
public static SingleClass newInstance() {
return singleClass;
}
public static void singleClassMethod(){
System.out.println("证明实例化一个singleClass对象,并调用了他的singleClassMethod方法");
}
}
package designModel.singleModel;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
*
* @author alertCode
*
*/
public class FixedNumSingleClass {
//定义能够产生最大的实例对象
private static int maxNumOfSingleClass=2;
//定义一个列表来收纳每个实例对象
private static List<String> list = new ArrayList<String>();
//定义一个列表来收纳所有的singleClass实例
private static List<FixedNumSingleClass> fixedNumOfSingleClassList=new ArrayList<FixedNumSingleClass>();
//当前对象的序号
private static int countNumOfSingleClass=0;
static{
for(int i=0;i<maxNumOfSingleClass;i++){
fixedNumOfSingleClassList.add(new FixedNumSingleClass("singleClass"+i));
}
}
private FixedNumSingleClass(String name){
list.add(name);
}
public static FixedNumSingleClass getInstance(){
Random random = new Random();
countNumOfSingleClass = random.nextInt(maxNumOfSingleClass);
return fixedNumOfSingleClassList.get(countNumOfSingleClass);
}
public static void testFixedMumOfSingleClass(){
System.out.println(list.get(countNumOfSingleClass));
}
}
package designModel.singleModel;
import org.junit.Test;
public class SingleModelTest {
@Test
public void singleClasstest() {
SingleClass newSingle = SingleClass.newInstance();
// 调用了SingleClass的静态方法,实现了一个SingleClass对象
newSingle.singleClassMethod();
}
//单例模式拓展,产生固定数量的FixNumSingleClass对象
//只有两个FixNumSingleClass对象
@Test
public void FixedNumSingleClassTest(){
for(int i= 0;i<5;i++){
FixedNumSingleClass newFixedNumSingle =FixedNumSingleClass.getInstance();
System.out.println(i+1+"个是对象");
newFixedNumSingle.testFixedMumOfSingleClass();
}
}
}
在spring容器中。每个Bean默认就是单例的,这样做的优点是Spring容器可以管理这些Bean的生命期,决定设么时候创建出来,什么时候销毁,销毁的时候要怎么处理等等。如果采用非单例模式,则Bean初始化后的管理交由J2EE容器,Spring容器不再跟踪管理Bean的生命周期。
单例模式在内存中只有一个实例,减少了内存的开支,一个对象频繁的创建销毁时,其优势显现;单例模式只生成一个实例,减少系统的性能的开销;可以避免对资源的多重占用;单例模式可以在系统中设置全局的访问点,优化和共享资源访问
单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码,基本上没有第二种途径可以实现;单例模式对测试是不利的,在并行的开发环境下,如果单例模式没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟一个对象
注:本文部分内容摘自秦小波的设计模式之禅一书
原文:http://www.cnblogs.com/keyidddd/p/5506984.html