设计模式之单例模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之单例模式相关的知识,希望对你有一定的参考价值。
1、单例模式的使用场景
1)、要求生成唯一序列号的环境
2)、在整个项目中需要一个共享访问点或共享数据
3)、在整个项目中需要消耗的资源过多,如要访问IO和数据库的资源
4)、需要定义大量的静态常量和静态方法(如工具类)的环境,可以使用单例模式,当然也可以直接声名为static的方式
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(); } } }
2、 单例模式的应用
在spring容器中。每个Bean默认就是单例的,这样做的优点是Spring容器可以管理这些Bean的生命期,决定设么时候创建出来,什么时候销毁,销毁的时候要怎么处理等等。如果采用非单例模式,则Bean初始化后的管理交由J2EE容器,Spring容器不再跟踪管理Bean的生命周期。
3、单例模式的优点
单例模式在内存中只有一个实例,减少了内存的开支,一个对象频繁的创建销毁时,其优势显现;单例模式只生成一个实例,减少系统的性能的开销;可以避免对资源的多重占用;单例模式可以在系统中设置全局的访问点,优化和共享资源访问
4、单例模式的缺点
单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码,基本上没有第二种途径可以实现;单例模式对测试是不利的,在并行的开发环境下,如果单例模式没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟一个对象
注:本文部分内容摘自秦小波的设计模式之禅一书
以上是关于设计模式之单例模式的主要内容,如果未能解决你的问题,请参考以下文章