概念

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”

类图

动机

对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机

实例

当一个类的实例可以有且只可以一个的时候就需要用到了。为什么只需要有一个呢?有人说是为了节约内存,但这只是单例模式带来的一个好处。只有一个实例确实减少内存占用,可是我认为这不是使用单例模式的理由。我认为使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢?
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有三种形式:

第一种形式:懒汉式

public class SingletonClass{private static SingletonClass instance=null;public static synchronized SingletonClass getInstance(){if(instance==null){instance=new SingletonClass();}return instance;}private SingletonClass(){}
}

第二种形式:饿汉式

public static class Singleton{//在自己内部定义自己的一个实例,只供内部调用private static final Singleton instance = new Singleton();private Singleton(){//do something
    }//这里提供了一个供外部访问本class的静态方法,可以直接访问public static Singleton getInstance(){return instance;}
}

第三种形式: 双重锁的形式。

public static class Singleton{private static Singleton instance=null;private Singleton(){//do something
    }public static Singleton getInstance(){if(instance==null){synchronized(Singleton.class){if(null==instance){instance=new Singleton();}}}return instance;}
}

转载于:https://www.cnblogs.com/myadmin/p/4949150.html

设计模式---(创建型)单例模式相关推荐

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

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

  2. 设计模式(java版)——创建型——单例模式

    项目源码已提交github:https://github.com/ckl001/designPattem_java 创建型 单例模式 1.饿汉模式 2.懒汉模式 3.内部类模式 4.枚举模式 破坏单例 ...

  3. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  4. 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)

    七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...

  5. 软考软件设计师---面向对象技术(设计模式--创建型--工厂、生成器、原型、单例)

    转载于自己博客文章: 软考软件设计师---面向对象技术(设计模式--创建型--工厂.生成器.原型.单例) - 松下之约一.创建型设计模式关注对象的创建,让一个类得到实例化过程由另一类的对象完成.分类: ...

  6. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript

    设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...

  7. 设计模式-创建型模式-建造者模式

    设计模式-创建型模式-建造者模式 建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 代码如下 // 产品类 public class Product{pu ...

  8. 设计模式-创建型模式-模板方法

    设计模式-创建型模式-模板方法 定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义一个算法的步骤. protected 对于本包及其子类可见. 类图 代码 代 ...

  9. 设计模式-创建型模式-工厂模式(工厂三兄弟)

    设计模式-创建型模式-工厂模式(工厂三兄弟) 工厂模式分为简单工厂,工厂方法,抽象工厂. 简单工厂模式 一个接口,三个具体类,一个工厂,通过选择,生产出对应的对象. package demo2;pub ...

  10. 设计模式-创建型模式-抽象工厂模式

    工程源码:设计模式-创建型模式-抽象工厂模式https://download.csdn.net/download/qq_40788199/85544119 码云:设计模式-创建型模式-抽象工厂模式ht ...

最新文章

  1. 颠覆认知:SRE 到底是干啥的?
  2. 在datagridview里添加自定义控件列
  3. 安装了ubuntu14.04+windows7双系统的笔记本启动后出现grub rescue提示符
  4. 抛弃windows用linux来工作吧
  5. java高级应用:线程池全面解析
  6. 进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17
  7. 【CV】基于python和OpenCV构建智能停车系统
  8. V-7 Openstack 在ceph中转换镜像格式
  9. 正则验证IP、掩码、端口
  10. lvds 共模电感_【成功案例】共模电感CM0805C221R-10解决车载LVDS信号的手持天线抗扰问题...
  11. activiti学习
  12. 5.3傅立叶变换意境级讲解
  13. 编译Libgdiplus遇到的问题
  14. 动态将ASPX生成HTML网页并将网页导出PDF
  15. C#——SqlParameter的使用方法及注意事项
  16. select()函数详解
  17. Android隐藏输入法 【有效】
  18. 《计算机视觉中的数学方法》
  19. VC|MFC内存不能为read,内存不能为 written 分析
  20. mysql主从配置duxi_mysql主从配置

热门文章

  1. 一个Java程序员的阿里面试心得,附答案解析
  2. 【408预推免复习】计算机组成原理之指令系统
  3. python【蓝桥杯vip练习题库】ADV-281特等奖学金
  4. python【力扣LeetCode算法题库】10-正则表达式匹配
  5. C++ with STL(一)
  6. oracle中resource权限,Oracle内置角色connect与resource的权限
  7. python实现项目的复制_Python之copy模块
  8. python for循环九九乘法表_python—用for循环、while循环和一句话打印九九乘法表
  9. sql 拼接int类型的字段_一套简单实用的SQL脚本(下篇)
  10. java 循环赛问题,网球循环赛思路 - 分治法求解(无代码)