黑马程序员_设计模式之单例



------------------------------------------------android培训java培训期待与您交流!-----------------------------------------------

概念
单例模式是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案

特点

1.单例类只能有一个实例
2.单例类必须自己自己创建自己的唯一实例
3.单例类必须给所有其他对象提供这一实例

单例模式UML图

单例模式创建方式分类

①饿汉式

//推荐使用这种方式创建
class Single
{
	private  Single(){}
	private static Single s = new Single();
	public static  Single getInstance()
	{
		return s;
	}
}
②懒汉式

//Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象
class Single
{
	private static Single s = null;
	private Single(){}
	public static Single getInstance()
	{
		//双重判断
		if(s==null)
		{
			synchronized(Single.class)
			{				
				if(s==null)
					s = new Single();
			}
		}
		return s;
	}
}
③登记式

public class Singleton
{
	private static Map<String, Singleton> map = new HashMap<String, Singleton>();
	// 静态初始化代码块,类一加载进虚拟机便创建一个实例
	static
	{
		map.put(Singleton.class.getName(), new Singleton());
	}
	private Singleton()
	{
	}
	// 静态工厂方法,返还此类惟一的实例
	public static Singleton getInstance(String name)
	{
		// 如果没有输入内容那么就获得该类的名称
		if (name == null)
		{
			name = Singleton.class.getName();
		}
		if (map.get(name) == null)
		{
			try
			{
				map.put(name, (Singleton) Class.forName(name).newInstance());
			} catch (Exception e)
			{
				e.printStackTrace();
			}
		}
		return map.get(name);
	}
}


❹运用场景

1. Windows的任务管理器就是很典型的单例模式我们不能开两个任务管理器
2.Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源
3.数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,用单例模式来维护,就可以大大降低这种损耗
4.多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制

❺优点及缺点

①优点

1.单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
2.因为类控制了实例化过程,所以类可以灵活更改实例化过程。

②缺点

1.虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。

2.使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类


-----------------------------------------android培训java培训、java学习型技术博客、期待与您交流! --------------------------


详情请查看:http://edu.csdn.net/heima




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值