1 设计模式(Design pattern)

代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
JAVA一共有23种设计模式,我们今天首先来学其中一种:单例设计模式

2 单例设计模式

单例模式可以说是大多数开发人员在实际中使用最多的,常见的Spring默认创建的bean就是单例模式的。
单例模式有很多好处,比如可节约系统内存空间,控制资源的使用。
其中单例模式最重要的是确保对象只有一个。
简单来说,保证一个类在内存中的对象就一个。
RunTime就是典型的单例设计,我们通过对RunTime类的分析,一窥究竟。

3 RunTime单例设计源码剖析

 /*** Every Java application has a single instance of class* <code>Runtime</code> that allows the application to interface with* the environment in which the application is running. The current* runtime can be obtained from the <code>getRuntime</code> method.* <p>* An application cannot create its own instance of this class.** @author  unascribed* @see     java.lang.Runtime#getRuntime()* @since   JDK1.0*/
public class Runtime {//2.创建静态的全局唯一的对象private static Runtime currentRuntime = new Runtime();//1.私有化构造方法,不让外部来调用/** Don't let anyone else instantiate this class */private Runtime() {}//3.通过自定义的静态方法获取实例public static Runtime getRuntime() {return currentRuntime;
}
}

通过分析,底层的实现思路一共分为了3个步骤:

  • 对本类构造方法私有化,防止外部调用构造方法创建对象
  • 创建全局唯一的对象,也做私有化处理
  • 通过自定义的公共方法将创建好的对象返回(类似封装属性后的getXxx() )

那我们不妨自己尝试着来写写单例模式

4 练习:单例设计模式1-饿汉式实现方式

创建包: cn.tedu.design
创建类: Singleton1.java

package cn.tedu.design;
/*本类用于实现单例设计模式实现方案1:饿汉式*/
public class Singleton1 {public static void main(String[] args) {//5.在main()中,不通过对象,直接通过类名,调用静态方法MySingle single1 = MySingle.getSingle();MySingle single2 = MySingle.getSingle();//6.用==检验是否是同一个对象System.out.println(single1 == single2);//trueSystem.out.println(single1);System.out.println(single2);}
}
//0.创建自己的单例程序
class MySingle{//1.提供构造方法,并将构造方法私有化/*1.构造方法私有化的目的:为了防止外界随意创建本类对象*/private MySingle(){ }//2.创建本类对象,并将对象也私有化//4.2由于静态资源只能调用静态资源,所以single对象也需要设置成静态private static MySingle single = new MySingle();//3.提供公共的访问方式,返回创建好的对象//4.1为了不通过对象,直接调用本方法,需要将本方法设置为静态public static MySingle getSingle(){return single;}
}

2.4 单例设计模式2-懒汉式实现方式
创建包: cn.tedu.design
创建类: Singleton2.java

package cn.tedu.design;
/*本类用于实现单例设计模式优化实现方案2:懒汉式
* 关于单例设计模式的两种实现方式:
* 1.饿汉式:不管你用不用这个类的对象,都会直接先创建一个
* 2.懒汉式:先不给创建这个类的对象,等你需要的时候再创建--延迟加载的思想
* 延迟加载的思想:是指不会在第一时间就把对象创建好占用内存
*               而是什么时候用到,什么时候再去创建对象
* 3.线程安全问题:由于我们存在唯一的对象single2,并且多条语句都操作了这个变量
*   如果将程序放到多线程的环境下,就容易出现数据安全的问题,所以解决方案:
*   1) 将3条语句都使用同步代码块包裹,保证同步排队的效果
*   2) 由于getSingle2()只有这3条语句,所以也可以将本方法设置为同步方法*/
public class Singleton2 {public static void main(String[] args) {//5.调用方法查看结果MySingle2 single1 = MySingle2.getSingle2();MySingle2 single2 = MySingle2.getSingle2();System.out.println(single1 == single2);System.out.println(single1);System.out.println(single2);}
}
//0.创建自己的单例程序
class MySingle2{//6.2创建一个静态的唯一的锁对象static Object o = new Object();//1.私有化本类的构造方法private MySingle2(){ }//2.创建的是本类对象的引用类型变量,用来保存对象的地址值,默认值是nullprivate static MySingle2 single2 ;//3.提供公共的get方法synchronized public static MySingle2 getSingle2(){//4.判断之前是否创建过对象,之前创建过就直接走return//之前如果没有创建过,才走if,创建对象并将对象返回//6.有共享数据+多条语句操作数据,所以尽量提前处理,避免多线程数据安全隐患//6.1 解决方案1:加同步代码块//6.2 解决方案2:将本方法getSingle2()设置为同步方法//因为这个方法里所有的语句都需要同步synchronized (o) {//静态方法中使用的锁对象也得是静态的if (single2 == null) {//single2还是默认值,说明之前没有创建过对象single2 = new MySingle2();//没创建过才创建,并赋值给single2}return single2;}}
}

单例设计模式到这里就结束啦,后续我们还可以继续学习下其他的设计模式哦~

下一节 注解 点这里哦

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

  1. java软件设计模式只单例设计模式

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

  2. 23种设计模式:单例设计模式(饿汉式 VS 懒汉式)

    23种设计模式:单例设计模式(饿汉式 VS 懒汉式) 每博一文案 世事浮沉,有太多的责任需要我们担当,生活中总有些挫折和磨难,让我们觉得快要杠不住了. 但当我们咬牙坚持过那段难熬的时光后,发现并没有想 ...

  3. java单例设计模式懒汉_Java设计模式之单例设计模式(懒汉、饿汉)

    [toc] Java设计模式之单例设计模式(懒汉.饿汉) 相信面试过的初中级Java开发的朋友可能都有遇到过单例设计模式的笔试题吧,如果之前没有背下来或者不理解,可以看看下面这篇文章,应该足够应付笔试 ...

  4. 单例设计模式介绍||单例设计模式八种方式——1) 饿汉式(静态常量) 2) 饿汉式(静态代码块) 3) 懒汉式(线程不安全) 4) 懒汉式(线程安全,同步方法)

    单例模式 单例设计模式介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法). 比如Hibernate的 ...

  5. 设计模式之单例设计模式(懒汉式)

    package july.star.thread22; /*** Teacher* 饿汉式:类一加载就加载* 懒汉式:需要时才加载* 面试题:单例模式的思想是什么,请用代码体现.* 开发:饿汉式(不会 ...

  6. 设计模式之单例设计模式(饿汉式)

    //饿汉式:类一加载就创建 //创建单例对象 package july.star.thread22;/*** Student* 创建单例对象* @author MoXingJian* @email 9 ...

  7. 菜鸟之路-浅谈设计模式之单例设计模式

    单例设计模式 定义:确保一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 单例模式是一种经常使用的软件设计模式.在它的核心结构中仅仅包括一个被称为单例的特殊类. 通过单例模式能够保证系统 ...

  8. JAVA设计模式之单例设计模式

    单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 在JAVA中实现单例,必须了 ...

  9. 详解:设计模式之-单例设计模式

    分享一波:程序员赚外快-必看的巅峰干货 前言 近期预计1-2周左右会更新设计模式专题文章. 单例设计模式:保证在一个JVM中,只能存在一个实例. 应用场景:Servlet,Spring IOC,线程池 ...

最新文章

  1. 计算机丢失mfc120u.dll,mfc120u.dll丢失怎么修好
  2. [每周软件]:Cucumber:未完待续的原因
  3. OpenSSH升级安装步骤(redhat)
  4. Java 容器学习之 HashMap
  5. bootstrap-multiselect加载本地数据
  6. Java verts_Java-JOGL绘制VBO黑屏
  7. SoftPAC 虚拟控制器漏洞使 OT 网络易受攻击
  8. 每一个写博客的程序猿,都应该被温柔对待
  9. 利用utl_smtp从oracle数据库发送带blob附件的电子邮件
  10. Atitit 身份证与银行卡校验规则
  11. 面试总结:测试常见面试题汇总
  12. 没能躲开的云服务容器网络问题
  13. wpf给模板控件添加事件一
  14. 【现代信号处理】 07 - 正则化
  15. kali 安装volatility_volatility的使用
  16. (四)SGE 常用命令
  17. 分享sina的短链生成java代码
  18. 深信服2018春季招聘-研发卷编程题 - 题解
  19. 无数据蒸馏方向文献_1
  20. 署名用by还是from_【转】SCI投稿流程各个步骤的经验谈

热门文章

  1. 关于 FileProvider(应用间共享文件)的一点总结
  2. linux中make命令大全,Linux中的命令 make -f 是什么意思
  3. Java全局异常捕捉
  4. 一份人人都能看懂的 Authing 介绍
  5. 一杯奶茶的钱,教你用ai生成美女变装热舞视频
  6. python字典换行输出_Python字典如何换行
  7. 车载软件架构——AUTOSAR的江湖夜雨十年灯
  8. 孪生网络:使用双头神经网络进行元学习
  9. 支付宝提示已停止访问该网页怎么解决
  10. 来源不明转载:两粒砂的爱情故事