为什么会有单例模式
Why
有很多我们只需要一个对象的情况:线程池、缓存、对话框、注册表的对象、日志对象、显卡等设备的驱动程序的对象。事实上,对于这种对象类型,如果我们实例化超过一个对象,就会碰到各种问题,像程序的行为异常、资源使用过量或者不一致的结果。
作用
用来确保为给定类实例化一个独一无二的对象。例如你有一个包含注册表设置的对象,你肯定不想让这个对象有多个副本,到处赋值——这会导致混乱。通过单例模式,可以确保应用中的每个对象使用同一全局资源。单例模式常常被用来管理资源池,像连接池、线程池。许多开发人员碰到bug,是因为有多个对象副本而他们去浑然不知。
单例模式为什么只有一个对象
1、构造方法的访问权限修饰符为private,只能在自己类中创建实例,不能在其他类中用new创建实例
2、通过本类中的静态方法使用new获取实例,赋值给本类中的静态变量
3、静态方法内含有一个判断实例对象是否存在的语句,如果存在返回该实例对象,不存在则创建实例对象
//单例类也是一个类(抽象数据类型),也具有自己想要的属性与行为,
//只不过因为添加了私有构造方法使它从普通类变成了单例类(好比男人和太监,不太恰当)
public Singleton{
//类型为Singleton的静态变量
private static Singletom uniqueInstance;
//其他有用的实例变量
//私有构造方法,只能在本类内创建实例
private Singleton{}
//静态方法,返回类型为Singleton
public Singleton getInstance(){
if(uniqueInstance == null)
uniqueInstance = new Singleton();
return uniqueInstance;
}
//其他有用的方法
}
我们让一个类来管理自己家的单个实例,同时也避免其他类自行创建新实例。想取得实例,只能通过该类。
单例模式提供该实例的全局访问点:无论何时你需要一个实例,只需要查询该类,他就会返回单个实例(类名.静态方法,很可能当你请求它时,它正在帮助其他对象),这可以使单例对象以延迟方式被创建(延迟实例化,第一次用时被实例化,不是在程序启动时就实例化,实例化之后就不需要再实例化了,只是从类中获取该实例化对象),这对资源密集的对象特别重要。
类图
总结
单例模式确保一个类只有一个实例,并提供一个全局访问点。