单例模式
在设计模式中最负盛名的一个模式,定义为:确保一个类中只有一个实例,并且自行实例化并向整个系统提供这个实例。它的意图是为了一个类有且仅有 这个实例,并为它提供了一个全局访问点。
单例模式分为饿汉模式和懒汉模式
共同点:
在类创建的同时就已经创建好一个静态对象供系统使用,并且以后不会在改变。
不同点:
饿汉模式---线程安全
懒汉模式---在创建实例对象时不加上synchronized则会导致对象访问线程不安全。
优势:
实例数量设置为一个,有利于节省内存空间。
可以为整个程序框架提供共享变量,最终提高代码的质量。
减少Java的命名空间。
时机:
当软件系统中多个程序只需要调用同一个实例对象时,
无需修改客户端代码,既可以使用有一个子类扩展的实例时,
系统性能需要进一步的优化时。
与struts:
在Struts1的action中实行的是线程安全的单例模式,其action只能用一个实例来处理相关的全部请求,并且Struts1具备使所有模块均具备生命周期的功能。
尤其要注意的是各个模块中的action要共享同一个生命周期。
Struts2的action对象具备使所有请求都产生对应一个实例的功能。因而可以理解为非单例模式。
为了便于理解,可以认为:Struts1 的数据不可以在action中编制,所以是单例模式,Struts2 的数据可以在action中编制,所以是非单例模式。
示例
饿汉式单例模式
public class JerrySingleton
{
private static JerrySingleton jerrysingleton = new JerrySingleton();
private JerrySingleton(){};
public synchronized static JerrySingleton getJerrySingleton()
{
return jerrysingleton;
}
}
懒汉式单例模式
<span style="font-size:18px;">public class JerrySingletonOne
{
private static JerrySingletonOne jerrySingletonOne=null;
private JerrySingletonOne(){};
public static JerrySingletonOne getJerrySingletonOne()
{
synchronized(this)
{
if (jerrySingletonOne==null)
{
jerrySingletonOne = new JerrySingletonOne();
}
}
return jerrySingletonOne;
}
}</span>
小结:
单例模式通过延迟实例化(只有在第一次使用它时才实例化),一个单例对象达到此目的的通用做法,而在多线程中,必须小心管理线程间的协作,因为它们访问
单例对象方法和数据的时间,只在毫厘之差。
对象具有唯一性,并不意味着使用了单例模式,单例模式通过隐藏了构造函数,通过对象创建的唯一入口点,从而将类的职责集中在类的单个实例中。