在长期的程序设计过程中,开发者们总结出了很多设计经验,最终经过整理和优化,变成了如今的设计模式;

设计模式有很多 有单例,工厂,代理等等。这里推荐一本关于Java设计模式的书籍 Head First设计模式

今天我们这里讲解的是最常用的单例模式;

在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在;

有两种实现,一种是饿汉式,一种是懒汉式;

我们上下代码,先上 饿汉式实现:

package com.java1234.chap03.sec18;public class Singleton {/*** 构造方法私有*/private Singleton(){}/*** 饿汉式单例实现*/private static final Singleton single=new Singleton();/*** 获取实例*/public static Singleton getInstance(){return single;}
}

这里我们构造方法私有 这样就保证了在外部是无法来实例化对象;

然后我们先在内部定义一个静态常量对象,然后再写一个static方法 来返回这个对象,这样就保证是一个对象了;

package com.java1234.chap03.sec18;public class Test {public static void main(String[] args) {Singleton singleton1=Singleton.getInstance();Singleton singleton2=Singleton.getInstance();System.out.println(singleton1==singleton2);}
}

运行输出:

true

这里获取里两个对象 我们前面讲过 用“==”来判断对象是否指向同一个内存区域,这里返回true,说明是同一个对象;

我们这里再来实现下 懒汉式子:

package com.java1234.chap03.sec18;public class Singleton2 {/*** 构造方法私有*/private Singleton2(){}/*** 懒汉式单例实现 在第一次调用的时候实例化*/private static Singleton2 single;/*** 获取实例*/public synchronized static Singleton2 getInstance(){if(single==null){System.out.println("第一次调用的实例化");single=new Singleton2();}return single;}
}

我们可以看到 区别  饿汉式是先定义实例的 而懒汉式是先定义引用,当第一次调用getInstance的时候 进行对象实例化操作;

当然这里我们考虑到多并发的情况 多个线程同时调用这个方法的时候,会出现问题,所以我们加了同步锁 synchronized 来保证

同一时刻只有一个线程进入方法;

package com.java1234.chap03.sec18;public class Test {public static void main(String[] args) {Singleton singleton1=Singleton.getInstance();Singleton singleton2=Singleton.getInstance();System.out.println("饿汉式:"+(singleton1==singleton2));Singleton2 singleton3=Singleton2.getInstance();Singleton2 singleton4=Singleton2.getInstance();System.out.println("懒汉式:"+(singleton3==singleton4));}
}

运行输出:饿汉式:true第一次调用的实例化懒汉式:true

转载于:https://www.cnblogs.com/xyg-zyx/p/9831794.html

Java 面向对象 --单例模式相关推荐

  1. 第7篇-JAVA面向对象Ⅲ

    第7篇-JAVA面向对象Ⅲ 每篇一句 :任何值得去的地方,都没有捷径 初学心得: 温故而知新 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-09| JAVA面向对象 Ⅲ] 1.J ...

  2. java面向对象程序设计第三版_JAVA面向对象程序设计之创建型设计模式

    [本文详细介绍了JAVA面向对象程序设计中的创建型设计模式,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 1.1 什么是设计模式 设计模式( Design pattern )是一套被反复使用.多数 ...

  3. Java学习-----单例模式

    一.问题引入 偶然想想到的如果把Java的构造方法弄成private,那里面的成员属性是不是只有通过static来访问呢:如果构造方法是private的话,那么有什么好处呢:如果构造方法是privat ...

  4. 舔砖加瓦(java)之java面向对象

    添砖加瓦(java) java面向对象 前言: 大家好我是kdy丶 文章目录 添砖加瓦(java) ***java面向对象*** 前言: 一丶面向对象与面向过程: 1丶面向对象与面向过程的区别: 2丶 ...

  5. 三篇文章彻底搞懂Java面向对象之一

    写在前面,Java基础系列文章都是作者基于b站尚硅谷的Java基础视频所做的笔记,没有时间的同学可以认真看看,如果有时间的同学,还是建议看看视频,毕竟笔记说到底还是自己的东西,每个人的习惯也是不一样的 ...

  6. Java面向对象设计模式

    设计模式(Design Patterns)   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是 ...

  7. java面向对象(高级部分)

    java面向对象 b站韩顺平java基础 文章目录 java面向对象 **类变量的内存布局** **类变量** **类方法** **使用类变量和类方法的注意事项** **深入理解main方法** ** ...

  8. Java面向对象思想以及原理以及内存图解

    文章目录 什么是面向对象 面向对象和面向过程区别 创建一个对象用什么运算符? 面向对象实现伪代码 面向对象三大特征 类和对象的关系. 基础案例 代码实现 实例化 创建car对象时car引用的内存图 对 ...

  9. java面向对象-------静态初始化块

    1.构造方法用于对象的初始化!静态初始化块,用于类的初始化操作,在静态初始化块中不能直接访问非static成员. package java面向对象; /** * 测试静态初始化块 */public c ...

最新文章

  1. 虽未达到科幻中的未来,人工智能革命仍已到来
  2. Community Server :: Forums
  3. 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
  4. fitype拟合多参数函数和遗传算法拟合多参数函数
  5. nginx配置ssl双向证书
  6. kdj超卖_kdj超买超卖是什么意思?kdj指标里说的“超买区,超卖区”什么意思?...
  7. 非官方影印版存在的问题
  8. Java:求矩阵每行之和
  9. 推荐一些不错的公众号【一】
  10. javascript入门之算术乘法表
  11. 帝国的黄昏:SQL是世界上最牛逼的语言
  12. 各代iphone尺寸_iphone屏幕尺寸比例是多少,iphone各代屏幕尺寸大小介绍
  13. 我为什么放弃百词斩?
  14. C++模拟手机通信录管理系统
  15. 黑苹果,Win7,Win10,Xp 各个系统镜像文件下载地址(备用)
  16. 含泪整理最优质马壁纸素材,你想要的这里都有
  17. ts获取服务器数据_ts 流服务器
  18. 【Flink实战系列】Lorg/apache/flink/kafka/shaded/org/apache/kafka/clients/consumer/ConsumerRecord;)Ljava/
  19. day19 javamail
  20. 互联网未来30年发展的大趋势,专家:竞争会更激烈!

热门文章

  1. CVPR2021 Oral|只用静态图,实时渲染出丝滑3D效果
  2. 学习 | 雷军 1994 年写的代码,不服不行
  3. Python编辑统一缩进(Pycharm)
  4. 存储Tensorflow训练网络的参数
  5. php多维求组按照健值排序,PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】...
  6. java nslookup_nslookup使用教程
  7. 基于JBox2d物理引擎和canvas的游戏开发实例
  8. Jmeter之Json表达式关联
  9. 视图with check option语句详解
  10. Linux学习之旅(一)Linux常用命令