2020-03-05 12:02:18

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


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
评论与留言
以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。

本站有缓存策略,时间约2小时后能看到您的评论。本站使用自动审核机制,如果您的内容包含广告/谩骂/恐怖/暴力/涉政等不和谐内容将无法展示!


本站有缓存策略,时间约2小时后能看到您的评论。本站使用自动审核机制,如果您的内容包含广告/谩骂/恐怖/暴力/涉政等不和谐内容将无法展示!

关注任霏博客
扫码关注「任霏博客」微信订阅号
微博:任霏博客网
Twitter:@renfeii
Facebook:任霏
最新留言 感谢🙏,第一个问题是空格的问题应该,我逐字敲完后可以构建了.第二个问题是我docker环境的问题,docker更新为最新版后需要重置配置文件.现已经正常使用,再次感谢您的分享和您的细心解答,期待下次相遇😄 还有一个问题可以请教下吗?就是我在容器里建文件夹没有权限,su root后密码不知道是多少,sudo mkdir xxx 提示我,没有sudo命令,请问有好的解决方法吗?谢谢解答 -v 后面可以指定文件吗 我的也是报错,还有。我执行了这个:@localhost kingbase-es-v8-r3-docker % docker run -d --name kingbase -p 54321:54321 -e SYSTEM_PWD=SYSTEM -v /opt/kingbase/data:/opt/kingbase/data -v /opt/kingbase:/opt/kingbase/Server/bin kingbase:v8r3 docker: 'run -d --name kingbase -p 54321:54321 -e SYSTEM_PWD=SYSTEM -v /opt/kingbase/data:/opt/kingbase/data -v /opt/kingbase:/opt/kingbase/Server/bin kingbase:v8r3' is not a docker command. See 'docker --help' 麻烦帮忙看下,是不是我写的命令有问题,还是版本问题,谢谢啦 请问我build的时候一直报错,是资源没了吗?failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://reg-mirror.qiniu.com/v2/library/centos/manifests/7?ns=docker.io": Moved Permanently 能不能在代码那里详细解释一下啊,没完全懂呀 en 按照路径上的来操作的,但是启动时一直报:zsh: no such file or directory: docker run -d --name kingbase -p 54321:54321 -e SYSTEM_PWD=SYSTEM -v /Volumes/installation/opt/kingbase/data:/opt/kingbase/data -v /Volumes/installation/opt/kingbase/bin/license.dat:/opt/kingbase/Server/bin/license.dat kingbase:v8r3 错误 博主,怎么没有spark入门教程? 亲测可用,十分感谢。 讲得好 我想提示博主,Adblock 广告屏蔽插件被启用提示这个弹窗非常不友好。它唯一的作用是影响用户阅读,甚至厌恶了离开。没有哪个用户会为了某一个站点而关闭防广告插件,因为这对于用户是不明智也不理智的,最终的伤害是贵站。