码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之单例模式

时间:2016-05-18 23:44:17      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

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的方式虚拟一个对象

注:本文部分内容摘自秦小波的设计模式之禅一书

设计模式之单例模式

标签:

原文地址:http://www.cnblogs.com/keyidddd/p/5506984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!