前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >单例模式

单例模式

作者头像
mingmingcome
发布于 2021-11-29 07:23:54
发布于 2021-11-29 07:23:54
31500
代码可运行
举报
运行总次数:0
代码可运行

2018-8-5 15:46:48

单例模式

使用场景

一个国家只需要一个皇帝。

单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个好的方法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。------《设计模式:可复用面向对象软件的基础》

例如,读取配置文件信息的类,这个类只需要在应用启动的时候读取一次就行,以后就从这个类获取相关配置信息就行。

好处

尽可能的节约内存空间,减少无谓的GC消耗,并且使应用可以正常运作。

一个类只有一个实例,每次使用时,都返回唯一的实例。相对于那些需要使用类就要new一个对象来说,初始化时分配内存空间,不使用了还要垃圾回收,简直是节俭的代表。

五种写法

一、懒汉式

线程不安全:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Singleton {
	private static Singleton singleton;
	private Singleton() {}
	public static Singleton getInstance() {
		if (singleton == null ) {
			singleton = new Singleton();;
		}
		return singleton;
	}
}

实例唯一:

1、私有化静态实例,带有static关键字的属性在每一个类中都是唯一的,带有private关键字的属性必须提供访问实例的方法。 2、私有化构造函数,限制客户端随意创建实例,保证没有其他实例被创建。 3、提供一个访问该实例的方法getInstance,这个方法必须是静态的,因为我们的实例是静态的。 4、只初始化一次,当唯一实例为null的时候,其他时候直接返回实例

线程安全:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Singleton {
	private static Singleton singleton = null;
	private Singleton() {}
	public static synchronized Singleton getInstance() {
		if (singleton == null) {
			singleton = new Singleton();
		}
		return singleton;
	}
}

同步getInstance访问方法,效率不高。

二、饿汉式(线程安全)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Singleton {
	private static Singleton singleton = new Singleton();
	private Singleton() {}
	public static Singleton getInstance() {
		return singleton;
	}
}

简单易理解且安全,我喜欢这种,虽然有时即使没有使用到它也会被实例化出来,但是喜欢就要喜欢它的所有,hh。

三、双重锁定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Singleton {
	private static Singleton singleton;
	private Singleton(){}
	public static Singleton getInstance() {
		if (singleton == null) {
			synchronized(Singleton.class) {
				if (singleton == null) {
					singleton = new Singleton();
				}
			}
		}
		return singleton;
	}
}

只同步创建实例的代码块,而且这个代码块执行的次数不会多,当然经常只有一次,效率比较高。

四、静态内部类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Singleton {
	private static class SingletonHolder {
		private static Singleton singleton = new Singleton();
	}
	private Singleton() {}
	public static Singleton getInstance() {
		return SingletonHolder.singleton;
	}
}

用内部类保存唯一的实例,另外好处是lazy loading(延迟加载),只有使用时才会实例化。

五、枚举

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pubic enum Singleton {
	INSTANCE;

	public void whateverMethod() {}
}

《Effectiv Java》第二版第3条:用私有构造器或者枚举类型强化Singleton属性 中,说单元素的枚举类型已经成为实现Singleton的最佳方法。

参考:

(一)单例模式详解

单例模式的七种写法

单例模式五种实现

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【机器学习基础】特征选择的Python实现(全)
机器学习中特征选择是一个重要步骤,以筛选出显著特征、摒弃非显著特征。这样做的作用是:
黄博的机器学习圈子
2021/02/12
2.1K0
【机器学习基础】特征选择的Python实现(全)
机器学习之特征选择(Feature Selection)
特征提取和特征选择作为机器学习的重点内容,可以将原始数据转换为更能代表预测模型的潜在问题和特征的过程,可以通过挑选最相关的特征,提取特征和创造特征来实现。要想学习特征选择必然要了解什么是特征提取和特征创造,得到数据的特征之后对特征进行精炼,这时候就要用到特征选择。本文主要介绍特征选择的三种方法:过滤法(filter)、包装法(wrapper)和嵌入法(embedded)。
Twcat_tree
2024/04/10
2.9K0
机器学习之特征选择(Feature Selection)
一文介绍机器学习中的三种特征选择方法
机器学习中的一个经典理论是:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。也正因如此,特征工程在机器学习流程中占有着重要地位。广义的特征工程一般可分为三个环节:特征提取、特征选择、特征衍生,三个环节并无明确的先手顺序之分。本文主要介绍三种常用的特征选择方法。
luanhz
2021/09/24
2.2K0
机器学习模型可解释性进行到底——特征重要性(四)
全局可解释代表着,是判定、选择某个特征的方法,包括:过滤法,嵌入法,包装法,和降维算法。 其中,嵌入法最为熟知,包括了特征重要性。
悟乙己
2021/12/07
2.4K0
机器学习模型可解释性进行到底——特征重要性(四)
特征选择与特征提取最全总结
在上篇特征选择与提取最全总结之过滤法中已经介绍了特征选择的其中一大方法--过滤法。本篇将继续介绍特征选择与特征提取方法,其主要内容如下所示。
数据STUDIO
2021/09/26
4.9K0
特征选择与特征提取最全总结
不想累死就来看看 : 特征工程之特征选择
地址:https://www.cnblogs.com/pinard/p/9032759.html
机器学习算法工程师
2018/07/26
5690
不想累死就来看看 : 特征工程之特征选择
机器学习之特征工程-特征选择
数据挖掘.jpg 从上面的数据挖掘场景可知,当数据预处理完成后,我们需要选择有意义的特征,输入机器学习的算法模型进行训练。通常来说,从两个方面考虑来选择特征: 特征是否发散:如果一个特征不发散,例如方
用户1332428
2018/03/08
2K0
机器学习之特征工程-特征选择
tidymodels用于机器学习的一些使用细节
R语言做机器学习的当红辣子鸡R包:mlr3和tidymodels,之前用十几篇推文详细介绍过mlr3
医学和生信笔记
2022/11/15
1.6K0
tidymodels用于机器学习的一些使用细节
预测建模常用的数据预处理方法
是金子总会发光,一个未经雕琢的数据,本身的价值也难以得到体现,通过数据预处理,可以让数据展现真正的价值;另外,不同的模型对数据有不同的要求,通过预处理可以让数据符合算法的要求,这样也能提高模型的预测能力。这就是数据预处理的重要作用!
医学和生信笔记
2023/02/14
1.5K0
预测建模常用的数据预处理方法
特征选择
特征选择特征选择概述Filter 过滤法方差选择法相关系数法卡方检验互信息法Wrapper 包装法稳定性选择(Stability Selection)递归特征消除特征值排序选择Embedded 嵌入法线性模型正则化树模型类别标签不平衡处理欠采样过采样加权处理
用户3577892
2020/06/11
1.3K0
特征选择
特征选择
特征选择是特征工程里的一个重要问题,其目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。另一方面,选取出真正相关的特征简化模型,协助理解数据产生的过程。并且常能听到“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”,由此可见其重要性。但是它几乎很少出现于机器学习书本里面的某一章。然而在机器学习方面的成功很大程度上在于如果使用特征工程。
Coggle数据科学
2019/09/12
1.1K0
特征选择
专栏 | 基于 Jupyter 的特征工程手册:特征选择(四)
数据预处理后,我们生成了大量的新变量(比如独热编码生成了大量仅包含0或1的变量)。但实际上,部分新生成的变量可能是多余:一方面它们本身不一定包含有用的信息,故无法提高模型性能;另一方面过这些多余变量在构建模型时会消耗大量内存和计算能力。因此,我们应该进行特征选择并选择特征子集进行建模。
红色石头
2022/01/16
6530
专栏 | 基于 Jupyter 的特征工程手册:特征选择(四)
几种特征选择方法的比较,孰好孰坏?
在本文中,重点介绍特征选择方法基于评估机器学习模型的特征重要性在各种不可解释(黑盒)及可解释机器学习方法上的表现。比较了CART、Optimal Trees、XGBoost和SHAP正确识别相关特征子集的能力。
数据STUDIO
2021/06/24
1K0
sklearn中的这些特征工程技术都掌握了吗?
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上 限而已。根据特征使用方案,有计划地获取、处理和监控数据和特征的工作称之为特征工程,目的是 最大限度地从原始数据中提取特征以供算法和模型使用。
1480
2019/07/30
4830
机器学习-R-特征选择
特征选择是实用机器学习的重要一步,一般数据集都带有太多的特征用于模型构建,如何找出有用特征是值得关注的内容。 1. Feature selection: All-relevant selection with the Boruta package 特征选择两种方法用于分析: (1)最少最优特征选择(minimal-optimal feature selection)识别少量特征集合(理想状况最少)给出尽可能优的分类结果; (2)所有相关特征选择(all-relevant feature selection
机器学习AI算法工程
2018/03/13
2.2K0
机器学习-R-特征选择
特征选择的几种方法[通俗易懂]
  使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:
全栈程序员站长
2022/07/23
5.6K0
特征选择的几种方法[通俗易懂]
使用R语言进行机器学习特征选择②
特征工程其实是一个偏工程的术语,在数据库领域可能叫做属性选择,而在统计学领域叫变量选择,其实是一个意思:即最大限度地从原始数据中提取有用信息以供算法和模型使用,通过寻求最优特征子集等方法使模型预测性能最高。
用户1359560
2018/10/22
1.7K0
机器学习-R-特征选择
特征选择是实用机器学习的重要一步,一般数据集都带有太多的特征用于模型构建,如何找出有用特征是值得关注的内容。 1. Feature selection: All-relevant selection with the Boruta package 特征选择两种方法用于分析: (1)最少最优特征选择(minimal-optimal feature selection)识别少量特征集合(理想状况最少)给出尽可能优的分类结果; (2)所有相关特征选择(all-relevant feature selection
小莹莹
2018/04/23
1.6K0
机器学习-R-特征选择
机器学习之特征工程(一)
本文介绍了特征工程与特征选择方法,包括基于统计方法的过滤法、基于树模型的特征选择、基于机器学习的方法、以及特征选择方法的评价指标。同时,还介绍了在Python中使用sklearn库进行特征选择的方法,包括递归特征消除法、相关系数法、基于惩罚项的特征选择和基于树模型的特征选择。
企鹅号小编
2018/01/05
1.2K0
预测建模中的重抽样方法
随着临床预测模型的愈加火爆,越来越多的医生/医学生开始搞临床预测模型,但其实这个东西已经很老了,并不是什么新鲜的东西。
医学和生信笔记
2023/02/14
1.4K0
预测建模中的重抽样方法
推荐阅读
相关推荐
【机器学习基础】特征选择的Python实现(全)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验