作为程序员必读经典《重构 改善既有代码的设计》《effective java》两本书,对于提升自己代码的优雅程度确实是非常有帮助。这段事件在学习设计模式,看了《大话设计模式》,虽然这是一本很受非议的一本书,但是每一件事情都是小马过河,不亲自试试怎么知道不适合自己呢。

看过大话设计模式之后,感觉有那么一丝明悟,对于面向对象的理解似乎有那么更近一层的理解,在写优质的代码方面,很有帮助。

进入正题,单例模式。

有些对象只需要一个,如:配置文件、工具类、线程池、缓存、日志对象等
多个程序读取一个配置文件,实际上配置文件还是只有一个,如果创造出多个实例,就会导致很多问题,占用资源过多,不一致的结果等
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

单例模式分类:

1、饿汉模式 加载类时创建实例,因此加载类比较慢,运行时获取实例比较快,且是线程安全的
2、懒汉模式 不在类加载时创建,获取时才创建实例,所以类加载时比较快而获取实例是比较慢,且是线程不安全

注:饿汉和懒汉名称上可以从这样区别:可以从创建实例的角度来考虑,饿汉式可能太饿了,先把实例创建好,
而懒汉式你要实例的时候我再给你创建,所以就慢了。
饿汉式实例:
//饿汉式
class Fruit{public static Fruit fruit = new Fruit();private Fruit(){}public static Fruit getInstance(){return fruit;}
}
  public static void main(String[] args) {//饿汉式Fruit f1 = Fruit.getInstance();Fruit f2 = Fruit.getInstance();System.out.println(f1);System.out.println(f2); }

懒汉式实例:

在该懒汉式中如果是单线程的话,可以保证创建一个实例,但是如果多线程的或就不一定了
懒汉式在多线程中的实例:
可以在全局方法上我们可以加上同步Sychronized关键字。
但是还是有问题,因为比如来了两个线程都到了if判断那里面,然后到达同步那时,只能进入一个,然后呢第一个线程进去之后new了一个对象,走了,第二个开始进入也是创建了一个对象,那么问题就出现了两个对象,所以还需改进,那么就在同步里面再加一个判断,那就是双重检查

public class Person {public static Person person;//定义私有的构造函数,防止外部进行创建对象private Person(){}public static Person getInstance(){if(person == null){synchronized(Person.class){if(person == null){//双重检查person = new Person();}}}return person;}
}
public static void main(String[] args) {//懒汉式Person p1 = Person.getInstance();Person p2 = Person.getInstance();System.out.println(p1);System.out.println(p2);}

本贴知识点由大兵哥给我的资料整理而成,发到csdn只是想在做一遍复习和养成写博客的习惯,致谢大兵哥~,大兵哥在平时的学习中给过我很多帮助和学习经验以及笔记。

原文发布在csdn http://blog.csdn.net/liu10010/article/details/71703489

转载于:https://www.cnblogs.com/suiyue-/p/6847104.html

【设计模式】之单例模式相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  3. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  4. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

  5. go设计模式之单例模式

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  6. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  7. Java 设计模式(3)单例模式

    前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...

  8. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

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

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

  10. 实践GoF的设计模式:单例模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...

最新文章

  1. MySQL 常见操作指令
  2. 温习 SQL 01(Z)
  3. YOLOv5初探(看来这个YOLO5做得还不是很完善,过段时间再试试??)
  4. 十 web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
  5. 数值计算方法(高斯消元以及LU分解)
  6. vue-cil+vuex 构建一个简单的记事本应用
  7. sklearn之线性回归和梯度下降
  8. Jzoj5425 数论
  9. 推荐:免费万能视音频转换软件--格式工厂
  10. mysql中int 5_mysql中int(x)与int以及varchar与char的区别_HelloWorld_ty的博客-CSDN博客
  11. c++ 深度拷贝和浅度拷贝
  12. iozone使用简介
  13. mysql登录框万能密码_网站登录万能密码
  14. SAP开发-同时定义同名的工作区、内表 OCCURS 0 WITH HEADER LINE
  15. java joda time_使用Joda-Time优雅的处理日期时间
  16. 项管行知03--项目类型
  17. android需要电脑输入吗,Android 远程输入法,用电脑给手机输入文字
  18. Kali工具库之cadaver
  19. memset函数原型
  20. 监控广告变现效果,开发者该如何搭建数据分析体系,如何制定优化策略?

热门文章

  1. 学生成绩信息的增删改查 通过控制台实现
  2. javascript获取对象高度和宽度(整理)
  3. 【Vegas原创】红烧肉的做法
  4. Qt5学习笔记之零碎问题记录
  5. js 控制滚动条位置
  6. [Swift]LeetCode229. 求众数 II | Majority Element II
  7. 洛谷 P1054 等价表达式
  8. CAS(Central Authentication Service)——windows上简单搭建及測试
  9. python的安装和运行
  10. 005. C#发送邮件