前言:今天去面试了一家公司,老板人挺好的。很多事亲力亲为,而且办事效率很高。也总结了一下上一份工作所学到的和自己的状态,在上一份工作中我也学到了很多很多,接触了很多的Android开发技术,感谢上一份工作为我带来的锻炼。我也要赶紧在最近把设计模式的学习笔记整理完毕,方便在下一份工作中能够提高自己的代码质量。

大丈夫当雄飞,安能雌伏?——《后汉书》
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
注意:Java中单例模式一般由一个私有的静态变量和一个私有的构造方法,一个公共的静态方法组成。
注意:Java中单例模式一般由一个私有的静态变量和一个私有的构造方法,一个公共的静态方法组成。
注意:Java中单例模式一般由一个私有的静态变量和一个私有的构造方法,一个公共的静态方法组成。
重要的事情要说三遍,记住这句话,其实就会写单例模式了。
今天我就不以故事和情节引入了,因为单例模式实在太简单了,如果设计这些情节反而弄巧成拙不易于理解。
package com.example.vicky.singletonpattern.SingletonPattern;/*** Created by Vicky on 2016/10/25.*/public class SingleClass {//私有的静态变量private static SingleClass singleClass;//私有的构造方法private SingleClass(){}//一个公共的静态方法public static SingleClass getSingleClass(){if (singleClass==null){singleClass=new SingleClass();}return singleClass;}
}
其实很容易理解,只要记住了我前面说的一句话,那也就记住了怎么去写一个单例模式。
在实例化对象的时候,由于我们把构造方法声明成了私有的,所以我们并不能通过new的方式去获取这个对象,而只能通过我们暴露的getSingleClass()方法去获取到对象。
在getSingleClass()方法中,我们通过判断singleClass对象是否为null,如果为null那么我们就进行实例化,然后返回这个对象。如果不为null,那我们就直接返回这个对象,这样也就保证了我们全局只有一个实例。
在我们需要实例化的时候,我们直接调用暴露的方法就可以了。
SingleClass singleClass=SingleClass.getSingleClass();
这样。一个简单的单例模式就完成了。
让我们再深入一点:
多线程的问题
我们知道我们的程序大多都是多线程的,但如果通过以上的简单的单例模式我们会遇到多线程带来的问题,当singleClass对象还没被创建时,线程1和线程2同时调用getSingleClass方法时,我们会发现,这时候会创建了两个Me的对象,造成单例模式的失效。
所以处理多线程,我们可以通过以下3种常用的方法进行改善我们的单例模式:
1、通过同步锁,添加synchronized确保同时只有一个线程执行getSingleClass方法:
public class SingleClass {//私有的静态变量private static SingleClass singleClass;//私有的构造方法private SingleClass(){}//一个公共的静态方法public static synchronized SingleClass getSingleClass(){if (singleClass==null){singleClass=new SingleClass();}return singleClass;}
}
优点:此方法的优点是简单,如果对性能要求不高的话,可以采用此方法
缺点:同步的方法造成程序执行效率下降
2、使用“急切”创建实例,而不用延时实例化的做法
package com.example.vicky.singletonpattern.SingletonPattern;/*** Created by Vicky on 2016/10/25.*/public class SingleClass {//私有的静态变量private static SingleClass singleClass=new SingleClass();//私有的构造方法private SingleClass(){}//一个公共的静态方法public static SingleClass getSingleClass(){return singleClass;}
}
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。

这也是我们日常中使用频率比较高的方式。
3、双重检查加锁,在getSingleClass中减少使用同步
package com.example.vicky.singletonpattern.SingletonPattern;/*** Created by Vicky on 2016/10/25.*/public class SingleClass {//私有的静态变量private static volatile SingleClass singleClass;//私有的构造方法private SingleClass(){}//一个公共的静态方法public static SingleClass getSingleClass(){if (singleClass==null){synchronized (SingleClass.class){if (singleClass==null){singleClass=new SingleClass();}}}return singleClass;}
}
优点:性能最优,不仅解决多线程问题,而且不影响性能
确定:Java5以上版本才能正常使用
好了,单例模式我们就已经学习完了,其实单例模式看起来很简单,其实记住我最开始说的那句话就好了,但在实际开发中,单例模式的出现率还是很高的。
最后替单例模式打一句广告,单例模式值得你拥有!

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

  1. Java学习--设计模式之创建型模式

    一.简介 创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活.创建型模式包括:工 ...

  2. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  3. 设计模式之创建型模式(工厂、原型、建造者)

    文章目录 创建型模式 2.1 工厂设计模式 2.1.1 简单工厂模式 2.1.2 工厂方法模式 2.1.3 抽象工厂 2.1.4 工厂模式总结 2.1.5 Spring中的工厂模式 2.1.6 工作中 ...

  4. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  5. GOF23设计模式(创建型模式)工厂模式

    目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...

  6. 设计模式之创建型模式

    2019独角兽企业重金招聘Python工程师标准>>> 随着对软件工程研究的不断深入,设计模式也越来越多了,根据其目的准则,划分如下: 1. 创建型:creational 与对象的创 ...

  7. 设计模式1—创建型模式

    模式          在一定环境中解决某一问题的方案,包括三个基本元素--问题,解决方案和环境.          大白话:在一定环境下,用固定套路解决问题. 设计模式(Design pattern ...

  8. 创建型模式、结构型模式和行为型模式_设计模式之创建型模式

    设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...

  9. GoF的23种设计模式之创建型模式的特点和分类

    创建型模式的主要关注点是"怎样创建对象?",它的主要特点是"将对象的创建与使用分离".这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关 ...

  10. PHP设计模式(2) -创建型模式

    创建型模式主要是为了解决创建对象的时候的问题而存在的. 创建型设计模式有两个主导思想:一是将系统使用的具体类封装起来,二是隐藏这些具体类的实例创建和结合方式. 创建型模式主要分为以下五种: 简单工厂模 ...

最新文章

  1. 【Java Web开发指南】mybatis的Example[Criteria]的使用
  2. springboot webservice接口调用_springboot远程调用dubbo服务接口
  3. 深度学习:神经网络基础知识总结
  4. 软件测试黑马程序员课后答案_软件测试课后习题答案
  5. python把列表写入excel_用Python将列表写入Excel文件
  6. 成功导入并运行breeze jar库
  7. Java德才论宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之 小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若
  8. Collections.sort的使用
  9. Javascript异步操作的异常处理
  10. mysql数据导入导出 CSV格式_MySQL中导入导出CSV格式数据
  11. 全球首发1毫秒计费模式,腾讯云引领Serverless时代新标准
  12. pythonsocket中tcp通信接收不到数据_通信中数据发生错误,接收方如何判决?检错码与纠错码必不可少...
  13. AXI Memory-Mapped SRIO收发控制器
  14. Tableau——备注
  15. 脑科学家:神经科学与大数据的结合带来的新领域
  16. 史上最详细的5-Why解说|优思学院
  17. iOS-不用网线搭建IPv6网络测试环境
  18. php study 6 string
  19. css3 从左到右自动换行和多行排列方式
  20. 【Python应用探索笔记二】百度语音合成与识别

热门文章

  1. 目标检测—RCNN系列
  2. 耳机插头4根线的含义和技巧
  3. IOI 2005 Riv 河流 题解
  4. Ubuntu 16.04如何使用无线网卡上网
  5. JAVA水晶花数_【原创】JAVA中令人眼花撩乱的数字魔法
  6. pip安装Cartopy小白版
  7. 视频转格式用什么工具?mp4格式转换器,好用的视频格式转换器
  8. 竞争学习神经网络详解
  9. 怎么将两个pdf文件合并在一起
  10. flash特效原理:图片切换滚动