单例模式(Singleton)

  • 一、核心特点
  • 二、应用场景
  • 三、设计思想
    • ·单例模式的特点:
      • 1.私有的构造函数:
      • 2.私有的静态的全局变量:
      • 3.公有的静态的方法:
  • 四、实现过程
    • 1.饿汉式创建:
    • 2.懒汉式创建:
    • 3.多线程下的单例:
    • 4.双重锁定
  • 五、代码实现
    • 1.饿汉式创建
    • 2.懒汉式创建
    • 3.多线程下的单例
    • 4.双重锁定
  • 六、程序源码
    • 1. Singleton类 的源码:
    • 2. 测试程序的 main方法:

一、核心特点

单例模式,是一种常用的软件设计模式。在它的核心结构中,只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,一个类只有一个实例。即 一个类只有一个对象实例。

二、应用场景

1.为了避免重复创建对象,浪费内存资源。
2.当多个线程同时访问同一资源时,保证数据安全。

三、设计思想

在JAVA中,对象是通过关键字new创建出来的,创建出来的对象被存放在堆内存里,它是始终存在的。
而方法的执行是在栈内存里,执行完就释放了消失了,所以方法是临时存在的。

·单例模式的特点:

1.私有的构造函数:

可以确保外部类无法通过构造方法,随便new出新的实例对象。

2.私有的静态的全局变量:

将唯一的一个实例对象,作为属性。
1>. 静态的,可以保证此实例对象是唯一存在的,
且外部类不需要通过创建此Singleton类,就可以直接获得这个实例对象。
2>. 私有的,可保证其他外部类,不能随便使用这个唯一的实例对象,保证数据安全。

3.公有的静态的方法:

向外部类提供 可以获得这个唯一实例对象的方法。
之所以是静态的,也是为了让外部类不需要创建对象,就可以直接使用这个方法。

四、实现过程

1.饿汉式创建:

Singleton类的创建:

主方法测试:(获得的是同一个对象)

2.懒汉式创建:

1>.首先,在属性那,先不创建那个唯一的实例。
由原来的 开局直接new对象
改为只声明属性,不new对象

** 2>.唯一实例对象的创建以及返回,全靠那个静态的公有方法。**
为了返回不为空的实例对象,需要由原来的,只返回实例对象的操作

增加一个创建对象的过程。

为了防止,每次调用这个方法都需要new一次对象,所以,应该为它加一下判断条件。

3.多线程下的单例:

·给方法加锁 synchronized,保证在多线程访问的情况下,也只产生唯一的实例对象。
·添加锁 synchronized,保证了当前这个方法在整个执行过程中,只允许一个线程访问它。但同时也是它造成其他线程工作效率变慢的原因。

4.双重锁定

为"临界资源"添加锁 synchronized,
既解决了 多线程的安全问题,又提高了工作效率。

五、代码实现

1.饿汉式创建

 /**     1.饿汉式创建     */private Singleton(){} //构造函数private static Singleton instance = new Singleton(); //属性public static Singleton getInstance(){  //方法return instance;}

2.懒汉式创建

 /**     2.懒汉式创建     */private Singleton(){} //构造函数private static Singleton instance ; //属性public static Singleton getInstance(){ //方法if (instance == null){instance = new Singleton();}return instance;}

3.多线程下的单例

 /*** 3.多线程下的单例:* 给方法加锁 synchronized,保证在多线程访问的情况下,也只产生唯一的实例对象。* 添加锁 synchronized,保证了当前这个方法在整个执行过程中,只允许一个线程访问它。* 但同时也是它造成其他线程工作效率变慢的原因。*/private Singleton(){} //构造函数private static Singleton instance ; //属性public synchronized static Singleton getInstance(){ //方法if (instance == null){instance = new Singleton();}return instance;}

4.双重锁定

/*** 4.双重锁定:* 既 解决了 多线程的安全问题,* 又提高了工作效率。*/private Singleton(){} //构造函数private static Singleton instance ; //属性public static Singleton getInstance(){if (instance == null){/**     锁定的资源 为当前Singleton类     */synchronized(Singleton.class){if (instance == null){instance = new Singleton();}}}return instance;}

六、程序源码

1. Singleton类 的源码:

/*** 单例模式 singleton :* 实现此类只能创建一个唯一的实例对象。*/public class Singleton {/*** 1.私有的构造方法,* 可以确保外部类无法通过构造方法随便new出新的实例对象*/private Singleton(){}/*** 2.将唯一的一个 实例对象instance,作为属性。** 静态的static,可以保证此实例对象是唯一存在的,* 且外部类不需要通过创建此Singleton类,就可以直接获得instance对象.** 私有的private,可保证其他外部类,不能随便使用这个唯一的实例对象,保证数据的安全。** 添加 volatile :防止在给属性赋值的时候,JVM指定重排序。*/private volatile static Singleton instance ;/*** 3.向外部类 提供 可以获得这个唯一实例对象的方法。** 之所以是 静态的static,也是为了让外部类不需要创建对象,就可以直接使用这个方法.** 为临界资源添加锁 synchronized,* 既 解决了 多线程的安全问题,又提高了工作效率。*/public static Singleton getInstance(){if (instance == null){/**     锁定的资源 为当前Singleton类     */synchronized(Singleton.class){if (instance == null){System.out.println("创建了一个对象!");instance = new Singleton();}}}return instance;}/**     1.饿汉式创建     */
//    private Singleton(){} //构造函数
//    private static Singleton instance = new Singleton(); //属性
//    public static Singleton getInstance(){  //方法
//        return instance;
//    }/**     2.懒汉式创建     */
//    private Singleton(){} //构造函数
//    private static Singleton instance ; //属性
//    public static Singleton getInstance(){ //方法
//        if (instance == null){
//            instance = new Singleton();
//        }
//        return instance;
//    }/*** 3.多线程下的单例:* 给方法加锁 synchronized,保证在多线程访问的情况下,也只产生唯一的实例对象。* 添加锁 synchronized,保证了当前这个方法在整个执行过程中,只允许一个线程访问它。* 但同时也是它造成其他线程工作效率变慢的原因。*/
//    private Singleton(){} //构造函数
//    private static Singleton instance ; //属性
//    public synchronized static Singleton getInstance(){ //方法
//        if (instance == null){
//            instance = new Singleton();
//        }
//        return instance;
//    }/*** 4.双重锁定:* 既 解决了 多线程的安全问题,* 又提高了工作效率。*/
//    private Singleton(){} //构造函数
//    private static Singleton instance ; //属性
//    public static Singleton getInstance(){
//        if (instance == null){
//            /**     锁定的资源 为当前Singleton类     */
//            synchronized(Singleton.class){
//                if (instance == null){
//                    instance = new Singleton();
//                }
//            }
//        }
//        return instance;
//    }}

2. 测试程序的 main方法:

public class Test_main {public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1);System.out.println(s2);System.out.println(s1 == s2);}
}

运行结果:

单例模式(Singleton) 1相关推荐

  1. python3中的单例模式Singleton

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-21 09:09:09 # @Author : cdl (1217096 ...

  2. Android设计模式——单例模式(Singleton)

    二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...

  3. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  4. python单例_Python - 单例模式(Singleton)

    单例模式(Singleton) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23374575 单例模式 , 类的实例从始至终, ...

  5. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  6. 设计模式之——单例模式(Singleton)的常见应用场景(转):

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  7. 设计模式(21):创建型-单例模式(Singleton)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  8. 设计模式之单例模式(Singleton)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  9. Golang 单例模式 singleton pattern

    在Java中,单例模式的实现主要依靠类中的静态字段.在Go语言中,没有静态类成员,所以我们使用的包访问机制和函数来提供类似的功能.来看下下面的例子: package singletonimport ( ...

  10. 单例模式——Singleton

    模式分类: 从目的来看: 1.创建型(Creational)模式:负责对象创建. 2.结构型(Structural)模式:处理类于对象间的组合. 3.行为型(Behavioral)模式:类与对象交互中 ...

最新文章

  1. alert在asp.net中如何使用??
  2. opendolphin_使用DolphinDB进行机器学习
  3. 云+X案例展 | 民生类:贝斯平云助力500强跨国企数字化转型
  4. windows mysql备份与恢复_windows下Mysql自动备份与恢复说明
  5. 修改mysql数据库默认字符集_MySQL数据库之修改mysql默认字符集的两种方法详细解析...
  6. result之global-results全局结果集
  7. java IEnumerator_获取实现接口的所有类型
  8. java中的测试类_java中测试类的方法
  9. 根据高德API获取poi数据
  10. QQ、淘宝、阿里旺旺在线网页链接代码及详解 很实用
  11. scala语言课程设计
  12. IP地址规划和设计方法
  13. 科研绘图自由之开放式绘图平台 (Figdraw)
  14. 什么是路由守卫?有什么用?
  15. python之爬虫(十一) 实例爬取上海高级人民法院网开庭公告数据
  16. UPC Imputation 树型dp
  17. 后端知识点链接(二):操作系统、Linux
  18. 2021年上半年软考真题及答案解析汇总
  19. realme有升级到android10的,RealmeX/Q将升级安卓10底层刷机包
  20. 西门子S7-1200控制V90伺服

热门文章

  1. 30 行Python代码实现蚂蚁森林自动收能量(附送源码)
  2. 使用键盘发布手柄控制信息
  3. html个人中心样式,个人中心.html
  4. 关于泰勒展开的细节-《三体》读后感的读后感
  5. 借助云开发,利用订阅消息,云函数路由实现小程序好友一对一聊天,添加好友等仿微信功能
  6. netlogon启动后停止_【通告更新】漏洞EXP已流出,影响巨大,微软NetLogon权限提升漏洞安全风险通告第三次更新...
  7. 据说Kivy可以将Python程序弄成App来玩,所以 安装Kivy。关于安装Kivy失败后的解决方案过程
  8. 电脑上不去无线网如何解决
  9. Win7环境下硬盘安装XP(无光驱/光盘安装XP)
  10. 跨越“数字鸿沟”,日本老年智能化服务的解法