设计模式之—1.单例模式

1.什么是单例模式

确保某一个类在整个项目中只有一个实例,并且自行创建实例化对象,并向整个系统提供这个实例。

2.单例模式通用类图

1.单例模式通过将构造函数设置为私有,来限制外部实例话对象。
2.提供一个getInstanse接口返回内部创建的实例对象。

类图如下:

3.单例模式的几种实现方法

方法一:饿汉模式

单例模式实现方式有多种,其中比较简单的实现方式是直接定义一个private的属性,并直接初始化。相关实现如下:

public class SingletonPattern {

    private static final SingletonPattern singletonPattern = new SingletonPattern();

    private SingletonPattern(){

    }

    public static SingletonPattern getInstance(){
        return singletonPattern;
    }
}

这种方法被称为饿汉模式,即不管有没有地方需要获取实例对象,都在类加载的时候直接实例话对象出来。此中方式类加载比较慢,但是获取实例对象比较快。

方法二:懒汉模式

另外一种实现方式被称为懒汉模式,即在第一次调用getInstance方法的时候才会创建实例话对象。实现方式如下:

public class SingletonPattern2 {

    private static SingletonPattern2 singletonPattern = null;

    private SingletonPattern2(){

    }

    public static SingletonPattern2 getInstance(){
        if (singletonPattern == null) {
            singletonPattern = new SingletonPattern2();
        }
        
        return singletonPattern;
    }
}

此种实现方式会有线程安全问题,即在getInstance中做了先检查再操作,下面是对此问题的一种解决方案:

public class SingletonPattern2 {

    private static SingletonPattern2 singletonPattern = null;

    private SingletonPattern2() {

    }

    public static synchronized SingletonPattern2 getInstance() {
        if (singletonPattern == null) {
            singletonPattern = new SingletonPattern2();
        }
        
        return singletonPattern;
    }
}

此种解决方式是在getInstance方法加了同步操作。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

Java中application对象的19个常用方法

applicaton表示一个javax.servlet.ServletContext对象。他实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服...

25550
来自专栏iOS 开发杂谈

如何实现LRU缓存淘汰算法

LRU:Least recently used,最近最少使用。缓存算法根据数据最近被访问的情况来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问...

21810
来自专栏惨绿少年

扩展正则表达式及应用

第1章 扩展正则表达式 1.1  + 前一个字符连续出现了1次或1次以上 egrep  "0+" oldboy.txt  1次或1次以上 >=1 egrep  ...

23100
来自专栏Jackie技术随笔

使用strptime函数时遇到的一个坑

做新专辑排序的需求时,需要对专辑的时间进行排序,由于目前该字段是字符串类型的日期,在排序函数中要转成标准的UNIX时间戳来进行对比,大概代码如下:

31480
来自专栏闻道于事

单例模式你会几种写法?

13150
来自专栏null的专栏

挑战数据结构和算法——跳台阶问题

题目来源“数据结构与算法面试题80道”。在此给出我的解法,如你有更好的解法,欢迎留言。 ? image.png 方法: int get_kind(int n...

28860
来自专栏技术之路

设计模式:单例模式

今天来简单来说一下单例模式:它要确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 比如我们登录一个系统的时候要记录一个员工的信息,在整个系统运行...

23280
来自专栏数据结构与算法

BZOJ5312: 冒险(势能均摊线段树)

结论:如果一次操作对区间& 和 区间| 产生的影响是相同的,那么该操作对整个区间的影响都是相同的

13020
来自专栏纯洁的微笑

jvm系列(一):java类的加载机制

1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Cl...

41360
来自专栏码云1024

C#文件

29950

扫码关注云+社区

领取腾讯云代金券