Java 设计模式-【单例模式】
单例解决了什么问题:为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例。为了确保对象的唯一性,我们可以通过单例模式来实现,这就是单例模式的动机所在。
单例的应用场景:一般是对于那些业务逻辑上限定不能多例只能单例的情况,例如:类似于计数器之类的存在,一般都需要使用一个实例来进行记录,若多例计数则会不准确。
饿汉式:
条件:
- 构造器私有化
- 本类对象作为本类的属性存在 用static 修饰保证只加载一次,不会重复创建对象
- 公共的静态的方法可以通过该方法拿到属性
优缺点:
优点:安全
缺点:可能会导致对象创建过早
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;
}
}
懒汉式:
条件:
- 构造器私有化
- 本类对象作为本类的属性存在 static 修饰 但是不进行初始化
- 公共的静态方法 并且判断是否给属性赋值
优缺点:
优点:对象总是被需要的时候才被创建 解决了可能加载时机过早的问题
缺点:在线程初期 线程不安全
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 设计模式-【单例模式】的更多相关文章
- java设计模式单例模式 ----懒汉式与饿汉式的区别
常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...
- Java设计模式の单例模式
-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...
- JAVA设计模式-单例模式(Singleton)线程安全与效率
一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...
- Java设计模式 - - 单例模式 装饰者模式
Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...
- 【设计模式】Java设计模式 - 单例模式
[设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...
- Java 设计模式 —— 单例模式
1. 概念: 单例模式是一种常用的软件设计模式.核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果 ...
- Java设计模式 - 单例模式 (懒汉方式和饿汉方式)
概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...
- java设计模式——单例模式(一)
一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...
- JAVA设计模式--单例模式
单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例 ...
- Java设计模式-单例模式(Singleton)
单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔 ...
随机推荐
- 【leetcode】1021. Best Sightseeing Pair
题目如下: Given an array A of positive integers, A[i]represents the value of the i-th sightseeing spot, ...
- 报数问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
n = int(input("请输入人数:")) list_p = list(range(1,n+1)) #将所有人放在一个数字里面 count = 0 #设置一个变量,用户计算报 ...
- 重温HTML和CSS3
重温Web前端基础 本篇幅中着重文字,只是记录一些自己的见解,巩固下自身基础 网页结构是什么? 结构层 html 导航,列表,段文字,图片,链接,表示层 css 颜色,大小,位置,行为层 JavaSc ...
- python利用eval方法提升dataframe运算性能
eval方法可以直接利用c语言的速度,而不用分配中间数组,不需要中间内存的占用. 如果包含多个步骤,每个步骤都要分配一块内存 import numpy as npimport pandas as pd ...
- QString的arg方法
第一个参数是要填充的数字,第二个参数为最小宽度,第三个参数为进制,第四个参数为当原始数字长度不足最小宽度时用于填充的字符,如 QString name=QString("R%1C%2&quo ...
- 如何在vue里面调用高德地图
1.修改webpac.base.conf.js文件 与module同一级添加 externals: { 'AMap': 'AMap', 'AMapUI': 'AMapUI' }配置. 然后在index ...
- Ionic4 入门
1.搭建环境 1.电脑安装node.js,安装后电脑会自动安装npm 2.通过cmd命令,安装cnpm npm install -g cnpm -registry=https://regist ...
- VMWARE ESXI 虚拟硬盘的格式:精简置备、厚置备延迟置零、厚置备置零
精简置备(thin): 精 简配置就是无论磁盘分配多大,实际占用存储大小是现在使用的大小,即用多少算多少.当客户机有输入输出的时候,VMkernel首先分配需要的空间并进行 清零操作,也就是说如果使用 ...
- 怎样使用haskell编写应用程序
参考:http://stackoverflow.com/a/9153617 http://www.haskell.org/haskellwiki/How_to_write_a_Haskell_prog ...
- java反射(三)--反射与操作类
一.反射与操作类 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成的操作,任何一个类的基本组成结构:父类(父接口),包,属性,方法(构造方法,普通方法)--获取类的 ...