一:什么是设计模式:是一套被反复使用,多人知晓的,经过分类编目的,代码设计经验的总结
二:使用设计模式的目的:为了可重用代码,让代码更容易让他人理解,保证代码的可靠性
1.单例模式:
1.单例模式目的:保证了应用程序中某个对象的实例有且只有一个,比如配置文件,缓存,日志对象等
2.单例模式的分类:
1.饿汉模式:
1.实现步骤:
1.自定义一个私有化的构造函数,不允许外部可以直接创建对象实例
2.创建一个使用private static修饰的唯一实例
3.为创建的唯一实例对象提供外部可以调用他的方法,也就是get方法
2.代码实现:
public class Singleton {
//1.将该类的构造方法私有化,不允许外部直接创建对象
private Singleton(){
}
//2.在该类的内部创建一个唯一实例,这里用static修饰是因为可以在其他类中同过类名.的方式访问到创建的实例
//private static Singleton instance = new Singleton();
//2.一般为了安全起见,一般会把我们的类成员变量私有化,所以要为该实例创建外部可以调用他的方法,也就是第三步
private static Singleton instance = new Singleton();
//3.为私有化的实例提供外部可以调用他的方法,也就是提供了一个get方法
public static Singleton getInstance() {
return instance;
}
}
3.总结:在类中创建一个唯一实例,该实例在类加载的时候就会实例化
2.懒汉模式:
1.实现步骤:
1.私有化共造方法,不允许外部直接创建对象
2.声明一个使用private static修饰的唯一实例,而不是创建
3.提供外部可以调用的方法,注意的是这里要进行判断唯一实例是否为空,因为第二部只是声明了一个实例,而不是创建
2.代码实现:
public class Singleton2 {
//1.将该类的构造函数私有化,不允许外部直接创建对象
private Singleton2(){
}
//2.声明一个唯一实例,而不是创建
private static Singleton2 singleton;
//3.为创建的唯一实例提供外部可以调用的方法
private static Singleton2 getSingleton(){
//判断唯一实例是否为空,如果为空则创建一个实例,不为空则直接返回该实例
if(singleton==null){
singleton = new Singleton2();
}
return singleton;
}
}
3.总结:声明一个唯一实例,类在加载的时候不会实例化,而是在具体调用的时候创建
3.饿汉模式和懒汉模式的区别:
1.类加载速度:因为饿汉模式在类加载时就实例化了一个对象,所以类加载速度较慢,而懒汉模式则是在调用对象时才实例化唯一实例,所以类加载速度比较快
2.获取对象速度:饿汉模式获取对象时比较快,因为在类加载时已经实例化了,而懒汉模式在获取对象时比较慢,因为对象在获取时被实例化
3.线程安全:饿汉模式是线程安全的,懒汉模式是线程不安全的
4.补充:因为上面的懒汉模式中的get方法会造成线程不安全,所以要在get方法加上synchronized