标签:
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