单例模式是23种设计模式中比较简单的一种,在此聊一下单例模式。

1.什么是设计模式?

对于没有接触过设计模式的人来说,一听到设计模式这四个字就觉得这个东西很高深莫测,一下子就对这个东西产生了恐惧感,其实设计模式是那些大佬在项目经验中领悟出来并总结出来的套路,这些套路能够用于应对项目开发中的特定问题,所以设计模式并不可怕(其实心里慌得一批。。。)。设计模式一共有23种,根据用途来分类,可分为三类:

  • 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
  • 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元 模式、代理模式
  • 行为型模式:模板访问模式、命令模式、迭代模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、责任链模式、访问者模式

2.单例模式的作用

保证一个类只有一个实例,并且提供访问该实例的全局访问点

3.单例模式的应用场景

  • Windows的Task Manager(任务管理器)就是很典型的单例模式
  • windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
  • 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取。
  • 网站的计数器,一般也是采用单例模式实现,否则难以同步。
  • 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
  • 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
  • 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
  • Application 也是单例的典型应用(Servlet编程中会涉及到)
  • 在Spring中,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理
  • 在servlet编程中,每个Servlet也是单例
  • 在spring MVC框架/struts1框架中,控制器对象也是单例

4.单例模式的实现方式(java)

4.1 饿汉式

 package Singleton;
/**
* 饿汉式单例模式
* @author cjj
*/
public class Singleton01 {
//在静态属性中创建实例
private static Singleton01 instance=new Singleton01();
//私有化构造器
private Singleton01() {}
//返回实例
public static Singleton01 getInctance() {
return instance;
}
}

为啥这种实现方式称为饿汉式呢?因为这种实现方式是在静态属性中创建实例的,静态属性在类加载的时候就已经创建好实例了,这个时候还没有开始使用实例呢,所以很形象地称之为饿汉式实现(手动狗头程序员并不都是无趣的动物。。。),所以这种实现方式会造成内存的损耗。

4.2 懒汉式

 package Singleton;
/**
* 懒汉式单例模式
* @author cjj
*
*/
public class Singleton02 {
//私有化构造器
private Singleton02() {
}
private static Singleton02 instance;
public static synchronized Singleton02 getInstance() {
if(instance!=null) {
instance=new Singleton02();
}
return instance;
}
}

饿汉式的鲜明对比是懒汉式,这种实现方式是在调用时才创建实例。用买车票的比喻来说明这两种实现方式,饿汉式是属于那种第二天才出行,它在前一天就已经预定好车票了,而懒汉式这个家伙呢,在汽车出发前一分钟才买好票。与饿汉式相比,这种实现方式似乎比较合理,however,这种实现方式解决了饿汉式的缺点,也带来新的问题——会造运行速度慢一些。正所谓“没有最好的算法,只有适合的算法,空间复杂度与时间复杂度难两全!”

4.3 静态内部类创建实例

 package Singleton;

 /**
* 用静态内部创建实例
* @author cjj
*
*/
public class Singleton04 { //用静态内部类来创建实例
static class SingleInstance{
public static final Singleton04 instance=new Singleton04();
}
//私有化构造器
private Singleton04() {}
//返回实例
public static Singleton04 getInstance() {
return SingleInstance.instance;
} }

这种实现方式结合了饿汉式和懒汉式两种方法的优点,即调用时加载类(静态内部类)并创建实例。

4.4枚举型创建单例

 package Singleton;

 public enum Singleton05 {
INSTAANCE;
public void Operation() { }
}

这种创建方式简单明了,在枚举类中设计就只有一个实例INSTAANCE,然后添加单例的操作就可以了,补充一下枚举型本质上也是属于一种类,每个枚举型都继承于java.lang.Enum<>类,所以枚举型也可以有成员方法的。这种方法避免了运用反射调用私有构造器来创建实例。

浅谈单例模式及其java实现的更多相关文章

  1. 新手码农浅谈观察者模式(java语言简单实现)

    一:什么是观察者模式: 官方定义:定义对象间一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 举个例子,很多人都会订阅天气预报,当气象台获得明天的天气情况( ...

  2. [OpenSource]浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...

  3. 浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...

  4. 源码浅谈(一):java中的 toString()方法

    前言: toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据. 最近项目中需要对一个ArrayList<ArrayList<Integer>> ...

  5. Java学习笔记——浅谈数据结构与Java集合框架(第二篇、Queue、Set)

    江南好,何处异京华. 香散翠帘多在水,绿残红叶胜于花.无事避风沙. --<纳兰词> 诗词再好,大图不能忘 上大图: 先说说栈和队列: 栈就好比手枪的弹匣,你往里面压入子弹,最先压入的子弹就 ...

  6. Java学习笔记——浅谈数据结构与Java集合框架(第一篇、List)

    横看成岭侧成峰,远近高低各不同.不识庐山真面目,只缘身在此山中. --苏轼 这一块儿学的是云里雾里,咱们先从简单的入手.逐渐的拨开迷雾见太阳.本次先做List集合的三个实现类的学习笔记 List特点: ...

  7. Java学习笔记——浅谈数据结构与Java集合框架(第三篇、Map)

    桃李春风一杯酒,江湖夜雨十年灯 --寄黄几复 之前图上写错了,是Hashtable类.t是小写的,它是个很古老的类,以至于命名都没有那么规范.. HashMap HashMap就是存储key-valu ...

  8. 浅谈如何用Java操作MongoDB

    NoSQL数据库因其可扩展性使其变得越来越流行,利用NoSQL数据库可以给你带来更多的好处,MongoDB是一个用C++编写的可度可扩展性的开源NoSQL数据库.本文主要讲述如何使用Java操作Mon ...

  9. 浅谈为什么一个java源文件中只能有一个public类?

    声明,本篇文章为转载 转载 http://blog.csdn.net/bareheadzzq/article/details/6562211 最近在一个java文件中实现了几个类,其中一个声明为pub ...

随机推荐

  1. 【HDU - 2181】哈密顿绕行世界问题(dfs+回溯)

    -->哈密顿绕行世界问题 Descriptions: 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市.  Input 前2 ...

  2. (H5)canvas实现裁剪图片和马赛克功能,以及又拍云上传图片

    1.核心功能 此组件功能包含: 图片裁剪(裁剪框拖动,裁剪框改变大小): 图片马赛克(绘制马赛克,清除马赛克): 图片预览.图片还原(返回原图.返回处理图): 图片上传(获取签名.上传图片). 2.核 ...

  3. XML中如果有特殊字符,比如> < 解决方案

    //只需要在代码前加这个就可以了<![CDATA[ 把代码写到这个位置 ]]>

  4. 业以太网:西门子PROFINET诊断功能SFC12-OB86-SFB20概览

    [OB86配合SFC12在PROFINET诊断中的应用] OB86是机架故障组织块,操作系统在检测到下列PN系统故障时将调用OB86: 1.检测到PROFINET IO设备故障,故障产生和消失时分别调 ...

  5. 嵊州D3T3 light

    嵊州D3T3 light 光恰似水 兄弟俩曾经 k 次受到过父母的物质激励. 一开始,兄弟俩的能力值为 1,最后,兄弟俩的能力值是 1 + (2 ^k−1)/ n . 当兄弟俩受到价值为 mi 的物质 ...

  6. 嗨,你真的懂this吗?

    this关键字是JavaScript中最复杂的机制之一,是一个特别的关键字,被自动定义在所有函数的作用域中,但是相信很多JvaScript开发者并不是非常清楚它究竟指向的是什么.听说你很懂this,是 ...

  7. Socket编程(C语言实现):bind()函数英文翻译

    本篇翻译的bind()函数,我参考的国外网站是: bind 朋友们可以自由转载我对英文的中文翻译,但是对于"作者注:"的描述,转载时请注明出处和作者,否则视为侵权. 下面是翻译的正 ...

  8. Thread-Per-Message设计模式

    import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; public class Te ...

  9. [leetcode] 8. String to Integer (atoi) (Medium)

    实现字符串转整形数字 遵循几个规则: 1. 函数首先丢弃尽可能多的空格字符,直到找到第一个非空格字符. 2. 此时取初始加号或减号. 3. 后面跟着尽可能多的数字,并将它们解释为一个数值. 4. 字符 ...

  10. [PTA] 数据结构与算法题目集 6-10 二分查找

    Position BinarySearch(List L, ElementType X) { int beg = 1; int end = L->Last; while (beg <= e ...