A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【济南校区】单例设计模式

我们在学习java基础课程的时候就简单的介绍过单例设计模式,相信大家对单例设计模式已经不陌生了,今天我们可以在回顾一下单例设计模式。
说道单例设计模式我们就不得不说这个设计模式的动机:对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
我们在基础班了解到,单例设计模式我们分为两种:懒汉式和饿汉式。但是不管是懒汉式还是饿汉式,我们的单例设计模式的书写遵循一个原则,一是构造方法必须为private修饰的,目的是为了确保只有一个实例。二是必须有一个public static 定义的实例方法或者public static 的实例属性,保障外部能访问。
代码实例:
最基本的懒汉式:
public class Test01 {
         private static Test01 instance;  
          
            private Test01() {  
            }  
          
            public static Test01 getInstance() {  
                if (instance == null) {  
                    instance = new Test01();  
                }  
                return instance;  
            }  
}
但是这样写的话是线程不安全的,如果我们想使代码线程安全,我们需要给线程加锁:
public class Test01 {
        private volatile static Test01 instance;  
          
    private Test01() {  
    }  
  
    public static Test01 getInstance() {  
        if (instance== null) {  
            synchronized (Test01.class) {  
                if (instance == null) {  
                    instance = new Test01();  
                }  
            }  
        }  
        return instance;  
    }
}
我们来看一下饿汉式的代码:
public class Test01 {
         private static Test01 instance = null;//也可以直接对instance赋值,效果相同  
            static {  
                instance = new Test01();  
            }  
          
            private Test01() {  
            }  
          
            public static Test01 getInstance() {  
                return instance;  
            }  
}
懒加载的饿汉式代码:
public class Test01 {
        private static class Test01Holder {  
        private static final Test01 INSTANCE = new Test01();  
    }  
  
    private Test01() {  
    }  
  
    public static final Test01 getInstance() {  
        return Test01Holder.INSTANCE;  
    }  
}
我们今天主要是以回顾我们的单例设计模式为主,大家可以在平常的代码中经常去使用。

如果你想了解更多黑马课程,如果你想加入黑马这个大家庭学习先进技术,光交天下好友,那就快来吧!
     黑马程序员济南中心联系电话:0531-55696830

1 个回复

正序浏览
我来占层楼啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马