单例解决了什么问题:为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例。为了确保对象的唯一性,我们可以通过单例模式来实现,这就是单例模式的动机所在。

单例的应用场景:一般是对于那些业务逻辑上限定不能多例只能单例的情况,例如:类似于计数器之类的存在,一般都需要使用一个实例来进行记录,若多例计数则会不准确。

饿汉式:

  条件:

  1. 构造器私有化
  2. 本类对象作为本类的属性存在 用static 修饰保证只加载一次,不会重复创建对象
  3. 公共的静态的方法可以通过该方法拿到属性

  优缺点:

    优点:安全

    缺点:可能会导致对象创建过早

 package com.设计模式;

 /**
  * 饿汉式
  */
 public class ObjectShow1 {
     public static int i = 123;
     //静态私有成员,类在加载初期完成初始化;同时带来加载过早的问题
     private static ObjectShow1 objectShow1 = new ObjectShow1();

     private ObjectShow1() {
         //私有构造函数,只能被列对象初始化
         System.out.println(i);
     }

     //使用public对外开放获取本类对象
     public static ObjectShow1 getObjectShow1() {
         return objectShow1;
     }
 }

懒汉式:

条件:

  1. 构造器私有化
  2. 本类对象作为本类的属性存在 static 修饰 但是不进行初始化
  3. 公共的静态方法 并且判断是否给属性赋值

优缺点:

    优点:对象总是被需要的时候才被创建 解决了可能加载时机过早的问题

    缺点:在线程初期 线程不安全

 package com.设计模式;

 /**
  * 懒汉式
  */
 public class ObjectShow2 {
     public static int i = 123;
     //静态私有成员,不用构造器进行初始化
     private static ObjectShow2 objectShow2 = null;

     private ObjectShow2() {
         //私有构造函数,只能被列对象初始化
         System.out.println(i);
     }

     //使用public对外开放获取本类对象,只有调用方法才会进行初始化
     public static ObjectShow2 getObjectShow2() {
         if (objectShow2 == null) {
             objectShow2 = new ObjectShow2();
         }
         return objectShow2;
     }
 }

双重检索式:

条件:

1.构造器私有化

2.本类的对象作为奔雷的属性存在 static 修饰 但不进行初始化

3.公共的静态方法 并且判断是否给属性赋值

优缺点:

    程序的前期 线程不安全

    Synchronized 锁

    Synchronized 代码块 要求同一时间只有一个线程进入代码块区域

    因为jvm内存模型的原因 双重检索 也会有微小的可能发生问题

 package com.设计模式;

 /**
  * 双重检索式
  */
 public class ObjectShow3 {
     public static int i = 123;
     //静态私有成员,不用构造器进行初始化
     private static ObjectShow3 objectShow3;

     private ObjectShow3() {
         //私有构造函数,只能被列对象初始化
         System.out.println(i);
     }

     //使用public对外开放获取本类对象,只有调用方法才会进行初始化
     public static ObjectShow3 getObjectShow3() {
         if (objectShow3 == null) {
             //同步块,线程安全的创建实例
             synchronized (ObjectShow3.class) {
                 //再次检查实例是否存在,不在才创建
                 if (objectShow3 == null)
                     objectShow3 = new ObjectShow3();
             }
         }
         return objectShow3;
     }
 }

静态内部类式:

条件:

1.定义一个静态内部类

2.外部类构造器私有化

3.外部类的对象 作为内部类的属性存在 static 修饰 进行初始化

4.公共的静态方法

优缺点:

    解决了,对象创建时机过早的问题

    没有产生线程安全问题

 package com.设计模式;

 /**
  * 静态内部类式
  */
 public class ObjectShow4 {
     public static int i = 123;

     static class InitObjectShow {
         private static ObjectShow4 os = new ObjectShow4();

         public static ObjectShow4 getObj() {
             return os;
         }
     }

     private ObjectShow4() {
         System.out.println("ObjectShow4.ObjectShow4");
     }

     public void show() {
         System.out.println("ObjectShow4.show");
     }
 }

Java 设计模式-【单例模式】的更多相关文章

  1. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  2. Java设计模式の单例模式

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

  3. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  4. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  5. 【设计模式】Java设计模式 - 单例模式

    [设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...

  6. Java 设计模式 —— 单例模式

    1. 概念: 单例模式是一种常用的软件设计模式.核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果 ...

  7. Java设计模式 - 单例模式 (懒汉方式和饿汉方式)

    概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...

  8. java设计模式——单例模式(一)

    一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...

  9. JAVA设计模式--单例模式

    单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例 ...

  10. Java设计模式-单例模式(Singleton)

    单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔 ...

随机推荐

  1. Linux 多个cpp文件的编译(Makefile)

    打包so文件: CC = g++ CFLAGS=-Wall -O2 -fPIC TARGET = libbg.so SRCS := $(wildcard *.cpp) OBJS := $(patsub ...

  2. php addcslashes()函数 语法

    php addcslashes()函数 语法 作用:返回在指定字符前添加反斜杠的字符串 语法:addcslashes(string,characters) 参数: 参数 描述 string  必须,规 ...

  3. iOS设计模式之装饰者模式

    一,什么是装饰模式 模式定义 装饰者包含被装饰者的所有接口和引用,方法实现完全是引用调用自己的方法,在装饰者子类添加新功能. 注释: Category不要重写被装饰对象的方法,否则改变了被装饰对象的行 ...

  4. 黄金含量版本——KTV

    呀,进来的都是盆友,首先先给大家拜年了,祝大家新年快乐,万事如意,家和万事兴~! 大家看了标题进来就不能让大家白进来,一定会让大家带着满满的果实. 下面我们就来讨论讨论KTV这个项目: (1)KTV的 ...

  5. spring cloud gateway 拦截request Body

    在接入Spring-Cloud-Gateway时,可能有需求进行缓存Json-Body数据或者Form-Urlencoded数据的情况. 由于Spring-Cloud-Gateway是以WebFlux ...

  6. <读书笔记>《Web前端开发最佳实践》

    P77 P89 CSS Reset P94 给CSS样式定义排序    排序工具:CSScomb P97 什么是CSS的权重?权重是指选择符的优先级 P100 工具:Sass Less P101 框架 ...

  7. python 类和对象下

    类的常用函数 issubclass() 检测一个类是否是另外一个类的子类 格式1:issubclass(被检测类,父类) 返回值:布尔值 格式1:issubclass(被检测类,(父类1,父类2,父类 ...

  8. Python多进程、多线程和协程简介

    一.进程和线程 进程是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.在单核CPU系统中的多进程,内存中可以有许多程序,但在给定一个时刻只有一个程序在运行: ...

  9. python内存管理及垃圾回收

    一.python的内存管理 python内部将所有类型分成两种,一种由单个元素组成,一种由多个元素组成.利用不同结构体进行区分 /* Nothing is actually declared to b ...

  10. hashtable C++实现

    模仿stl,实现了开链法形式的hashtable.纯属练手,仅仅实现其基本功能,不当之处还望指正.本文为实现独立的空间配置器. #include<iostream> #include< ...