休息下,找个电影看看睡觉吧?

编程开发

GoF的23种设计模式讲解和演示:(一)单例模式-懒汉式单例-饿汉式单例

2020年03月05日 12:02:18 · 本文共 1,359 字阅读时间约 4分钟 · 2,330 次浏览
GoF的23种设计模式讲解和演示:(一)单例模式-懒汉式单例-饿汉式单例

什么是单例模式

单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。主要用于解决对象频繁的创建和销毁问题,同时可以保证逻辑的正确,例如Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。

单例模式有 3 个特点:

  1. 单例类只有一个实例对象;

  2. 该单例对象必须由单例类自行创建;

  3. 单例类对外提供一个访问该单例的全局访问点;

单例模式的实现

单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。

懒汉式单例

该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。代码如下:

package net.renfei.designpatterns.singleton;
/**
 * 懒汉单例模式
 *
 * @author RenFei
 */
public class LazySingleton {
    /**
     * 保证 instance 在所有线程中同步
     */
    private static volatile LazySingleton instance = null;
    
    /**
     * private 构造方法保证外部无法实例化
     */
    private LazySingleton() {
    }
    /**
     * synchronized 保证线程安全
     */
    public static synchronized LazySingleton getInstance() {
        //getInstance 方法前加同步
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

饿汉式单例

该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。

package net.renfei.designpatterns.singleton;
/**
 * 饿汉单例模式
 *
 * @author RenFei
 */
public class HungrySingleton {
    /**
     * 类一旦加载就创建一个单例
     */
    private static final HungrySingleton instance = new HungrySingleton();
    
    /**
     * private 构造方法保证外部无法实例化
     */
    private HungrySingleton() {
    }
    public static HungrySingleton getInstance() {
        return instance;
    }
}

懒汉单例模式虽然节省资源,但使用时如果没有被实例化第一次性能会差一些;饿汉模式虽然使用时很快,但在初始化的时候就要执行实例化逻辑,在程序启动装载时比较慢,同时不管是否需要使用都载入内存会比较费资源。

单例模式的应用场景

前面分析了单例模式的结构与特点,以下是它通常适用的场景的特点。

在应用场景中,某类只要求生成一个对象的时候,如一个班中的班长、每个人的身份证号等。

当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等。

当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等。

商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.renfei.net/posts/1003338
评论与留言

以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。

微信搜一搜:任霏博客