设计模式,是一种经验的总结(个人理解)形成的不具约束力的规范和实现。
由于java基础的薄弱,对单例模式不太理解,甚至现在再学还是只会学到皮毛,但是还是一点点看和学吧,等某一天了解了其深层次原理的时候才算学通了。
单例模式的目的是保证对象的唯一性,这就需要保证其他程序无法创建对象,且本类创建的对象唯一,只对外提供该类的方法。
保证第一点:构造函数私有化。
保证第二点:在本类中创建对象,且唯一。
保证第三点:提供获取对象的方法,public。
(1)只适合单线程环境
原因:多线程环境下同时判断if可能生成多个对象
public class Test {
private Test(){}//私有化构造函数
private static Test test=null;
public static Test getInstance()//对外提供获取实例的方法
{
if(null==test)
{
test=new Test();//本类中创建对象
}
return test;
}
}
(2
)适合多线程环境(懒汉式)
原因:getInstance()方法加了同步锁
public class Test2 {
private Test2(){}//私有化构造函数
private static Test2 test2=null;
public static synchronized Test2 getInstance()//对外提供获取实例的方法
{
if(null==test2)
{
test2=new Test2();//本类中创建对象
}
return test2;
}
}
(3)两次判断,加同步锁
原因:当test3为null时才加同步锁创建实例,否则无需获取同步锁
public class Test3 {
private Test3(){}//私有化构造函数
private static Test3 test3=null;
public static Test3 getInstance()//对外提供获取实例的方法
{
if(null==test3){
synchronized (Test3.class) {
if(null==test3)
{
test3=new Test3();//本类中创建对象
}
}
}
return test3;
}
}
(4)饿汉式(推荐使用)
原因:加载该类时就生成一个Test4的静态实例(使用到该类的话迟早要创建该实例),但是过早初始化该实例占用内存,达不到lazy loading的目的
public class Test4 {
private Test4(){}
private static Test4 test4 = new Test4();
public static Test4 getInstance()
{
return test4;
}
}
(5)静态内部类(推荐)
还看得不太理解,看懂了补充。