认识设计模式(一)---单例模式(1)
(一)单例模式介绍
- 一句话说出单例模式的所用:就是用方法让整个系统中,某个类只存在一个对象实例,并且这个类值提供一个取得该对象实例的方法(静态方法)。
- 举个栗子吧:Hibernate的SessionFactory,它充当数据存储源的代理,并且负责创建Session的对象,通常一个项目只需要一个SessionFactory就够了。
(二)单例模式的八种方式
- 饿汉式(静态常量)
- 饿汉式(静态代码块)
- 懒汉式(线程不安全)
- 懒汉式(线程安全,同步方法)
- 懒汉式(线程安全,同步代码块)
- 双重检查
- 静态内部类
- 枚举
(三)饿汉式(静态常量)
(1)步骤如下:
- 构造器私有化(防止new再获取对象)
- 类的内部创建对象
- 向外暴露一个静态的公共方法,getInstance,这个唯一的方法用来获取对象实例
(2)单例类代码如下:
class Singleton01{
//1-构造器私有化,外部不能new,只能在内部用
private Singleton01(){}
//2-本类内部创建对象实例(构造器不能用,那我自己内部new一个对象,给外界调用)
private final static Singleton01 instance=new Singleton01();
//3-提供一个公有的静态方法,返回实例对象
public static Singleton01 getInstance(){
return instance;
}
}
(3)测试类代码如下
public class SingletonTest01 {
public static void main(String[] args) {
//不是通过new来创建对象,而是通过getInstance来获取一个现成的对象
//优点:避免了线程同步问题
//缺点:类装载时就完成实例化,没有达成懒加载,会造成内存的浪费
Singleton01 instance01=Singleton01.getInstance();
Singleton01 instance02=Singleton01.getInstance();
System.out.println(instance01==instance02);//true
System.out.println("instance01hashCode="+instance01.hashCode());//93122545
System.out.println("instance02hashCode="+instance02.hashCode());//93122545
}
}
(四)优缺点分析
(1)优点
写法简单,获取类的时候,类会在内部自动创建好一个对象实例,而使用者直接调用getInstance这个方法就可以获取到一个对象实例。
(2)缺点
优点也可能会成为它的缺点,类一旦加载就会创建实例化对象,不存在lazy loading(懒加载),如果你压根没用到这个对象,那么这个对象就会一直占用内存,造成内存的浪费。
(五)总结
这种单例模式可以用,但是要考虑一点,它可能会造成内存浪费