单例模式是指确保一个类只有一个实例,且自行实例化,并向整个系统,提供这个实例,供全局访问单例模式也为分饿汉和懒汉模式
两者区别如下
相同点:在类创建的时候就一句创建好了一个静态对象提供系统使用,并且以后都不在改变
不同点:饿汉模式线程是安全的,懒汉模式,在创建实例对象时不加上synchronzied会导致对象的访问不是线程安全的
单例优势
1.实例数量设置为一个,有利于节约内存空间
2.可为整个程序框架提供共享变量,最终提高代码的重用性
3.可减少java的程序的命名空间
应用时机1.当软件系统中多个程序只需要调用一个实例对象时
2.无需修改客户端程序,即可使用由子类进行扩展实例时
3.当系统的性能需要进一步优化时。
package model.singleton;
/**
* 饿汉模式
* @author 66
*
*/
public class JackSingleton {
//饿汉模式的意思就是系统一启动自动实例化,不是就挺饿的上来就给它丫的实例化喂饱它
private static final JackSingleton jackSingleton = new JackSingleton();
//构造方法是私有的
private JackSingleton() {
}
public synchronized static JackSingleton getInstance(){
return jackSingleton;
}
}
package model.singleton;
/**
* 懒汉模式
*/
public class JackSingletong {
private static JackSingletong jackSingletong = null;
private JackSingletong(){
}
//懒汉模式,说明比较懒要在用的时候才给别人创建实例
synchronized static JackSingletong getInstans(){
if(jackSingletong == null){
jackSingletong = new JackSingletong();
}
return jackSingletong;
}
}
单例模式与Struts
目前Struts主流框架它包括Struts1和Struts2.由于Struts2和Action对象又具备使所有请求均会产生对应的一个实例功能,因而我们理解为非单太模式。在struts1中的Action中实行的是线程安全的单例模式,其action只可拥有一个实例来处理相关的全部请求,并且Struts1具备使用所有模块均可拥有生命周期的功能.尤其要注意的是各个模块中的Action都需要共同分享同一个生命周期
其实我们这么认为,Struts1的数据不可在Action中编制,所以其可实现单例模式,而Struts2的数据在Action中编制,因而其不能运用单例模式