单例模式是比较简单的一个模式,项目中也经常用得到。

实现细节

将类的构造方法设置为私有的(private),通过个公有的(public)的方法来获取类的实例。

代码示例

public class Singleton {private static Singleton singleton= null;public static Singleton getSingleton(){if(singleton==null){singleton = new Singleton();}return singleton;}private Singleton(){//System.out.println("new singleton");}
}

上边的这个例子在高并发的情况下可能会出现同步问题,如果一个线程在完成if判断但是对象未能创建完成的时候另一个线程也进行if判断,那么内存中就会产生多个实例,为了保证线程安全,可以采用以下两种方法。

第一种做法,直接实例化类

public class Singleton {private static Singleton singleton= new Singleton();public static Singleton getSingleton(){     return singleton;}private Singleton(){//System.out.println("new singleton");}
}

第二种方法,对if判断加锁

public class ConcurrentSingleton {private static ConcurrentSingleton singleton = null;private ConcurrentSingleton(){//System.out.println("new singleton");}public static ConcurrentSingleton getSingleton(){if(singleton==null){createSingleton();}return singleton;}private static synchronized void createSingleton() {if(singleton==null){singleton = new ConcurrentSingleton();}}
}

单例模式的优缺点

优点是在内存中只存在一个实例,减少内存开销和创建、销毁对象的性能损耗,可以避免对资源的多种占用,优化和共享资源访问。

缺点是扩展比较困难。

单例模式的扩展

如果一个类只能生成限定个数的实例,可以通过扩展单例来实现

代码实例

public class MultiInstanceSingleton {private static int maxInstanceSize = 5;private int number = 0;public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}private static Vector<MultiInstanceSingleton> vec = new Vector<MultiInstanceSingleton>();private MultiInstanceSingleton(){}private MultiInstanceSingleton(int num){this.number = num;}private static synchronized MultiInstanceSingleton createInstance(){return new MultiInstanceSingleton(vec.size());}public static MultiInstanceSingleton getInstance(){MultiInstanceSingleton instance = null;if(vec.size()<maxInstanceSize){instance = createInstance();vec.add(instance);}else{int num = new Random().nextInt(maxInstanceSize);instance = vec.elementAt(num);}return instance;}public void doSomething(){System.out.println("我是"+this.number+"号");}public static void main(String[] args) {for(int i=0;i<50;i++){getInstance().doSomething();  }}}

【设计模式笔记】单例模式Singleton Pattern相关推荐

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

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

  2. Java设计模式之单例模式(Singleton Pattern)

    **单例模式:用来创造独一无二的,只能有一个实例的对象设计模式.单例模式确保一个类只有一个实例,并提供一个全局访问点.**相比于全局变量(对对象的静态引用),单例模式可以延迟实例化,而且全局变量不能保 ...

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

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

  4. Net设计模式实例之单例模式( Singleton Pattern)

    一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯 ...

  5. 单例模式 Singleton Pattern

    源地址 单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该 ...

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

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

  7. .NET设计模式(1):1.1 单例模式(Singleton Pattern)

    概述 单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单 ...

  8. HeaFirst设计模式-单件模式[单例模式](Singleton Pattern)

    深入分析单件模式 本次主要介绍的内容有 单件模式 单线程下的单件模式实现 多线程下实现单件模式出现的问题分析 JMM内存模型 多线程下的单件模式实现的三种方式 这些内容,可以从最根本理解单例模式的代码 ...

  9. Python 设计模式: 单例模式(singleton pattern)

    2019独角兽企业重金招聘Python工程师标准>>> 如果想在整个程序的运行过程中,某个类只有一个实例的话,可以通过单例模式来实现. 在 Python 中实现单例模式有很多种方式, ...

最新文章

  1. R构建鲁棒回归模型(Robust Regression)
  2. nuxt.js 本地开发跨域问题(Access-Control-Allow-Origin)及其解决方案
  3. 详解一个自己原创的正则匹配IP的表达式
  4. [导入]c# GDI+简单绘图(一)
  5. Ubuntu命令整理
  6. 简单多边形的三角剖分相关技术
  7. eLife:科勒Moxie 会唱歌的花洒
  8. Android View绘制流程
  9. 【Unity实战100例】Unity幸运大转盘之概率可控
  10. 打单词游戏 html5,html打字游戏
  11. 树莓派3强大很多--相比树莓派2
  12. 免费的云服务器推荐,你会选择哪一款
  13. PDF编辑器首选工具Acrobat Pro DC
  14. 题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:2021年焊工(初级)考试资料为正在备考焊工(初级)操作证的学员准备的理论考试专题,每个月更新的焊工(初级)免费试题祝您顺利通过
  15. sshpass报错Host key verification failed
  16. Visual Studio帮助文档安装以及设置(内置msdn)
  17. arena of valor服务器未响应,传说对决 -Arena of Valor-启动后一直黑屏无法进入什么原因...
  18. 对于后台站点的用户活跃度统计 除了记录用户登陆时间进行筛选,还有没有别的方法
  19. 操作系统真象还原 第一章
  20. ws2_32.dll和wsock32.dll

热门文章

  1. shell/bash:nohup脚本控制程序启动停止重启
  2. 牛客网《直通BAT面试算法精讲课》优惠码
  3. 第六届“飞思卡尔”杯智能汽车竞赛赛后总结
  4. mongoClient php Auth mechanism not specified报错解决
  5. 智能算力的枢纽如何构建?中国云都的淮海智算中心打了个样
  6. dnf7月7日服务器维护,关于DNF5在小长假更新后的第一次7月7日更新内容的详细说明...
  7. c语言实现十进制转换为二进制
  8. 摄像头在H5的实时播放功能实现历程
  9. 4 anbox 树莓派_树莓派卸载lxde,换xfce4
  10. App程序上传流程图