单例模式
创建型模式。 有的时候我们一个系统中,可能只需要一个类的一个对象就足够了,在这种情况下,我们就没有必要再创建多个对象。以后系统都要记录日志 ,记录日志把系统运行的日志信息记录到一个文件中,这种情况如果有多个对象去记录日志,就会产生问题,所以以后一般系统中都会只有创建一个日志对象。Factory结尾的类,基本上都是单例模式。
单例模式是最简单的设计模式,单例模式有很多实现方式。今天我们说两种 实现方式 ,饿汉式单例模式 ,懒汉式单例模式。
饿汉式单例模式
package com.aaa.mode.singleton; /*** 饿汉式单例模式 */
public class HungrySingleton {
//第一个步骤 构造方法私有化
private HungrySingleton(){ }
//第二个步骤 创建这个类的私有的静态的唯一的对象
private static final HungrySingleton singleton = new HungrySingleton();
//第三个步骤,提供一个静态方法 用来获取这个类生成的唯一的对象
public static HungrySingleton getInstance(){
return singleton;
}
public static void main(String[] args) {
HungrySingleton s1 = HungrySingleton.getInstance();
HungrySingleton s2 = HungrySingleton.getInstance();
System.out.println(s1==s2);
}
}
懒汉式单例模式
package com.aaa.mode.singleton;
/*** 懒汉式单例模式 */
public class LazySingleton {
//第一个步骤 构造方法私有化
private LazySingleton(){ }
//第二个步骤 创建这个类的私有的静态的唯一的对象
private static LazySingleton singleton;
//第三个步骤,提供一个静态方法 用来获取这个类生成的唯一的对象
public static LazySingleton getInstance() {
if(singleton==null){
singleton = new LazySingleton();
}
return singleton;
}
public static void main(String[] args) throws Exception {
LazySingleton s1 = LazySingleton.getInstance();
System.out.println(s1);
LazySingleton s2 = LazySingleton.getInstance();
System.out.println(s2);
System.out.println(s1==s2);
}
}
两种实现方式的优缺点:
饿汉式: 单例模式不会存在线程安全问题 ,但是有可能会浪费系统的资源。
懒汉式: 单例模式 存在线程安全问题 ,但是资源利用率比饿汉式要高。