认识设计模式(一)---单例模式(1)

(一)单例模式介绍

  • 一句话说出单例模式的所用:就是用方法让整个系统中,某个类只存在一个对象实例,并且这个类值提供一个取得该对象实例的方法(静态方法)。
  • 举个栗子吧:Hibernate的SessionFactory,它充当数据存储源的代理,并且负责创建Session的对象,通常一个项目只需要一个SessionFactory就够了。

(二)单例模式的八种方式

  1. 饿汉式(静态常量)
  2. 饿汉式(静态代码块)
  3. 懒汉式(线程不安全)
  4. 懒汉式(线程安全,同步方法)
  5. 懒汉式(线程安全,同步代码块)
  6. 双重检查
  7. 静态内部类
  8. 枚举

(三)饿汉式(静态常量)

(1)步骤如下:

  1. 构造器私有化(防止new再获取对象)
  2. 类的内部创建对象
  3. 向外暴露一个静态的公共方法,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(懒加载),如果你压根没用到这个对象,那么这个对象就会一直占用内存,造成内存的浪费。

(五)总结

这种单例模式可以用,但是要考虑一点,它可能会造成内存浪费

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值