Java设计模式--单例模式

声明:本文根据慕课网汤小洋老师的精品课程整理来的:慕课网

什么是设计模式(Design Pattern)?

  设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。

什么情况下使用单例模式?

  有些对象我们只需要一个,比如:配置文件,工具类,线程池,缓存,日志对象等,这种情况下我们要保证整个应用中某个实例有且仅有一个,如果创造出多个实例就会导致很多问题,比如:占用很多资源,结果不一致等。

单例模式的作用?

  保证整个应用程序中某个实例有且仅有一个。

单例模式类型有几种?

  1.饿汉模式

  2.懒汉模式

单例模式之饿汉模式的实现方式?

  1.将构造方法私有化,不允许外界直接构造对象。

  2.创建类的唯一实例,使用private static修饰。

  3.提供一个用于获取实例的方法,使用public static修饰。

  特点:在加载的时候就产生实例对象。

 public class Singleton {
//1.将构造方法私有化,不允许外界直接构造对象。
private Singleton(){ }
//2.创建类的唯一实例,使用private static修饰
private static Singleton instance = new Singleton(); //3.提供一个用于获取实例的方法,使用public static修饰
public static Singleton getInstance(){
return instance;
}
}

  多线程测试饿汉模式:

 /**
* 多线程测试单例模式--饿汉模式
* @author Administrator
*
*/
public class Test2 { public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
new Thread(()->{
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
}).start();
}
} }

  测试结果:

单例模式之懒汉模式的实现方式?

  1.将构造方法私有化,不允许外界直接构造对象。

  2.声明类的唯一实例,使用private static修饰。

  3.提供一个用于获取实例的方法,使用public static修饰。

 public class Singleton2 {

     //1.将构造方法私有化,不允许外边直接创建对象
private Singleton2(){ }
//2.声明类的唯一实例,使用private static修饰
private static Singleton2 instance;
//3.提供一个用于获取实例的方法,使用public static修饰
public static Singleton2 getInstance(){
if(instance == null){
instance = new Singleton2();
}
return instance;
}
}

饿汉模式和懒汉模式的区别?

  饿汉模式的特点是:加载类时比较慢,因为在加载类时就创建对象,但运行时获取对象的速度比较快,因为对象已经创建好了,线程安全。

  懒汉模式的特点是:加载类时比较快,因为在加载类时只是声明对象,但运行时获取对象的速度比较慢,因为要创建对象,线程不安全。

懒汉模式保证安全性的实现方法--DCL?

  使用synchronized关键字修饰获取实例的方法代码块,在代码块中重新判断实例是否为空。

/**
* 单例模式(懒汉模式)--使用DCL保证线程安全
* DCL:double-check-locking
* @author Administrator
*
*/
public class Singleton3 { //1.将构造方法私有化,不允许外边直接创建对象
private Singleton3(){ }
//2.声明类的唯一实例,使用private static修饰
private static Singleton3 instance;
//3.提供一个用于获取实例的方法,
//使用synchronized关键字修饰获取实例的代码块,
//并重新判断实例是否为空
public static Singleton3 getInstance(){
if(instance == null){
synchronized(Singleton3.class){
if(null == instance)
instance = new Singleton3();
}
}
return instance;
}
}

一种广泛的单例模式,结合饿汉模式和懒汉模式。

  使用静态代码块的方式实现。

 /**
* 通过静态代码块实现懒加载
* 比较广泛的一种单例模式
* @author Administrator
*
*/
public class SingletonHolder {
private SingletonHolder(){ }
//在加载内部类的时候,instance不会实例化,之后当调用Holder.instance的时候,才会实例化SingletonHolder
private static class Holder{
private static SingletonHolder instance = new SingletonHolder();
} public SingletonHolder getInstance(){
return Holder.instance;
}
}

使用枚举类型作为内部类进行单例模式的实现:

 /**
* 通过使用内部枚举类来进行实例化
* @author Administrator
*
*/
public class SingletonEnum01 {
//私有构造方法
private SingletonEnum01(){ }
//构造内部枚举类,具有延迟加载的特性
private enum EnumHolder{
//声明的变量在加载的时候自动加载一次,类型为SingletonEnum
INSTANCE;
private SingletonEnum01 instance;
EnumHolder(){
this.instance = new SingletonEnum01();
}
//构造私有访问方法
private SingletonEnum01 getInstance(){
return instance;
}
}
//创建静态外部访问方法
public static SingletonEnum01 getInstance(){
return EnumHolder.INSTANCE.getInstance();
}
}

Java基础知识之设计模式--单例模式的更多相关文章

  1. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  2. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  3. 第二十七节:Java基础面向对象-静态,单例模式,继承详情知识点

    前言 Java基础面向对象-静态,单例模式,继承详情知识点.静态-static关键字,static变量,静态代码块,代码块(不加静态),对象创建过程,单例模式,继承. 静态-static关键字 // ...

  4. java基础知识精华

    转载:https://www.jianshu.com/p/6c078abb720f java基础知识 java内存模型 java运行时数据区域 hashMap 如何解决冲突 存储方式 冲突达到一定数量 ...

  5. java基础知识一览(二)

    一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...

  6. 黑马毕向东Java基础知识总结

    Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记    侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...

  7. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  8. Java 基础知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  9. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

随机推荐

  1. 003eop常见问题设置

  2. Python用PIL将PNG图像合成gif时如果背景为透明时图像出现重影的解决办法

    最近在用PIL合成PNG图像为GIF时,因为需要透明背景,所以就用putpixel的方法替换背景为透明,但是在合成GIF时,图像出现了重影,在网上查找了GIF的相关资料:GIF相关资料 其中有对GIF ...

  3. Okhttp解析—Okhttp概览

    Okhttp解析-Okhttp概览 Okhttp作为目前Android使用最为广泛的网络框架之一,我们有必要去深入了解一下,本文是Okhttp解析的第一篇,主要是从宏观上认识Okhttp整个架构是如何 ...

  4. 《算法笔记》之基础C/C++进阶

    这一次主要讲C++不同于C的地方:类. 1.类的定义 定义一个类,本质上是定义一个数据类型的蓝图.这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可 ...

  5. java中高级并发SPI机制

    Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制. 适用于:调用者根据实际使用需要,启用.扩展.或者替换框架的实现策略. 要使用Java SPI,需要遵循如下约定 ...

  6. 【转】出现“ValueError : numpy.ufunc has the wrong size, try recompiling" 解决方法

    出现这个问题的原因是:numpy版本和scikit-learn版本不搭配. 解决方法: 升级numpy即可: pip install -U numpy

  7. rabbitmq系列(一)初识rabbitmq

    为什么要使用消息中间件 案例:假如我们开发了一个商品抢购网站.这个网站的目的就是在某一时间点进行抢购商品,同时要求用户注册,在注册的时候会同时给用户电话和邮箱中发送验证码,以便完成信息注册.传统做法应 ...

  8. Date类与日期格式

    Date类概述: 表示特定的瞬间,精确到毫秒. Date()分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒).Date(long date)分配 Date 对象并初始化此对象,以表 ...

  9. Java类成员之方法

    方法含义: 1. 方法是类或对象行为特征的抽象,用来完成某个功能操作. 2.在某些语言中也称为函数或过程. 3.将功能封装为方法的目的是简化代码,可以实现代码重用. 4.在Java里的方法不能独立存在 ...

  10. 12.Android-SQLiteOpenHelper使用

    1.SQLite介绍 SQLite,是一款轻型的数据库,它的优缺点有如下: 轻量级,适合嵌入式设备,并且本身不依赖第三方的软件,使用它也不需要“安装”. 并发(包括多进程和多线程)读写方面的性能不太理 ...