美文网首页Java设计模式
设计模式-Java-建造型01-单例模式

设计模式-Java-建造型01-单例模式

作者: 茂茂的小破号 | 来源:发表于2022-06-27 21:59 被阅读0次

1 定义

单例模式确保一个类仅有一个实例,并且自行初始化且向整个系统提供使用。

2 使用场景

  • 某个类要求只生成一个对象的场景,如一个国家只有一个皇帝。
  • 整个项目需要一个共享访问点,如网站的上的登陆人数计数器。
  • 某一个类的对象需要频繁的被创建与销毁,并且创建销毁性能无法被优化,如线程池,网络连接池。
  • 一些硬件级别的操作,需要一个单一的操作入口。
  • 对象需要被共享的场合,如配置对象、数据库连接池。

3 优缺点

优点:

  1. 保证内存里只有一个实例,减少内存开销。
  2. 避免资源被多重占用。
  3. 设置全局访问点,优化共享资源的访问。
    缺点:
  4. 违背开闭原则:单例模式通常没有接口很难扩展,一般只有修改原有的类。
  5. 违背单一职责原则:单例模式的功能通常都写在一个类中
  6. 测试困难:在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟一个对象。

4 实现

饿汉式

饿汉式表明在类被加载的时候就建立单例对象。

public class HungrySingleton {
    private static final HungrySingleton hungrySingleton = new HungrySingleton();

    private HungrySingleton(){};

    public static HungrySingleton getHungrySingleton(){
        return hungrySingleton;
    }
}

懒汉式

只有在第一次获取单例对象时采取创建单例对象,优点:节省内存开销,加快程序启动速度。

实现方式1-synchronized

public class LazySingleton {
    private static volatile LazySingleton lazySingleton;

    private LazySingleton(){}

    public static synchronized LazySingleton getLazySingleton(){
        if(lazySingleton == null){
            lazySingleton = new LazySingleton(); 
        }
        return lazySingleton;
    }
}

其中synchronized与volatile关键字是为了保证线程安全,缺点是每次访问都需要加锁,并发性差,并且消耗更多资源。

实现方式2-双重检查

实现方式1是在方法上加锁,每次get的时候都会执行加锁动作,即使实例已经被初始化完成。那么能否在判断实例未初始化时再加锁进行创建呢,这样get实例的时候就不用加锁了。实现方式如下:

public class LazySingletonDoubleCheck {
    private static volatile LazySingletonDoubleCheck instance;

    private LazySingletonDoubleCheck(){};

    public LazySingletonDoubleCheck getInstance(){
        if(instance == null){
            synchronized(LazySingletonDoubleCheck.class){
                if(instance == null){
                    instance = new LazySingletonDoubleCheck();
                }
            }
        }
        return instance;
    }
}

其中第一次检查是看实例是否被初始化,没有的话则对类进行加锁,获得锁后会再次判断实例是否被初始化(防止多个线程同时加锁的情况),如果实例未被初始化,则进行初始化。

相关文章

  • 设计模式-Java-建造型01-单例模式

    1 定义 单例模式确保一个类仅有一个实例,并且自行初始化且向整个系统提供使用。 2 使用场景 某个类要求只生成一个...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

  • 基础设计模式:单例模式+工厂模式+注册树模式

    基础设计模式:单例模式+工厂模式+注册树模式 单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象...

  • 单例模式

    JAVA设计模式之单例模式 十种常用的设计模式 概念: java中单例模式是一种常见的设计模式,单例模式的写法...

网友评论

    本文标题:设计模式-Java-建造型01-单例模式

    本文链接:https://www.haomeiwen.com/subject/dluovrtx.html