最通俗易懂的单例模式讲解-设计模式


2020.11.26

概述

单例模式是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。

解决问题

保证一个类只有一个实例

为什么要控制一个类所拥有的实例数量? 最常见的原因是控制某些共享资源的访问权限。

如果你已经创建了一个对象, 过一会你决定又创建一个对象,此时你会获得之前已创建的对象。

为该实例提供一个全局访问节点

想想平时用来存储重要对象的全局变量,使用上非常方便,但也非常不安全。任何代码都可以覆盖掉变量的内容,从而引发程序崩溃。

和全局变量一样,单例模式也允许程序在任何位置访问特定对象,不同的是还可以保护该实例不被覆盖。

实现

  1. 在类中添加一个私有静态成员变量保存单例实例。

  2. 防止其他对象使用单例类的new运算符,将类的构造函数设为私有。

  3. 声明一个公有静态方法用于获取单例实例。

真实世界类比

一个学校里校长只能有一个,校长位置确定后就不能被随意篡改。

UML

image-20201126162437635

代码

基础单例单线程

Single.java

public final class Singleton {
    private static Singleton instance;
    public String value;

    private Singleton(String value) {
        this.value = value;
    }

    public static Singleton getInstance(String value) {
        if (instance == null) {
            instance = new Singleton(value);
        }
        return instance;
    }
}

Client.java

public class DemoSingleThread {
    public static void main(String[] args) {
        System.out.println("If you see the same value, then singleton was reused (yay!)" + "\n" +
                "If you see different values, then 2 singletons were created (booo!!)" + "\n\n" +
                "RESULT:" + "\n");
        Singleton singleton = Singleton.getInstance("马保国");
        Singleton anotherSingleton = Singleton.getInstance("婷婷");
        System.out.println("混元形意太极掌门人是 " + singleton.value);
        System.out.println("混元形意太极掌门人是" + anotherSingleton.value);
    }
}

执行结果

If you see the same value, then singleton was reused (yay!)
If you see different values, then 2 singletons were created (booo!!)

RESULT:

混元形意太极掌门人是 马保国
混元形意太极掌门人是 马保国

应用场景

  • 程序中的某个类对于所有客户端只有一个可用的实例
  • 严格地控制全局变量

优缺点分析

优点

  • 保证一个类只有一个实例
  • 获得了一个指向该实例的全局访问节点

缺点

  • 违反了单一职责原则,该模式同时解决了两个问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lor :)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值