设计模式之单例模式及应用demo
单例模式是创建型模式之一。
单例模式顾名思义是单例的,也就是只有一个实例化对象,这都来源于它的私有化构造函数。
单例模式特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例
单例模式的应用场景:Windows的Task Manager(任务管理器);网站的计数器; 多线程的线程池的设计; Web应用的配置对象的读取(由于配置文件是共享的资源)。
单例模式的五种实现方法:
在看实现方法之前,要先了解一些java的知识:1、初始化顺序依次是:(静态变量、静态初始化块)–>(普通变量、初始化块)–> 构造器;如果有父类,则顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法 。
2、静态变量特点:static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配,后面根据需要是可以再次赋值的。公共性,就是说,一个类的静态成员,它是属于大伙的,所有的类对象共享的,不像成员变量是自己的。
1、饿汉模式
public class Singleton {
// 私有构造
private Singleton() {} private static Singleton instance = new Singleton(); // 静态工厂方法,方法没有同步块,所以效率高。
public static Singleton1 getInstance() {
return instance;
}
}
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
2、懒汉模式
public class Singleton {
private static Singleton instance;
private Singleton (){}
//使用的同步锁,降低了效率,但是在多线程可以防止创建多个实例
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
3、双重检测模式
public class Singleton {
public static volatile Singleton singleton = null; private Singleton(){} public static Singleton getInstance(){
if(singleton == null){
synchronize (Singleton.class){
if( singleton == null ) {
singleton = new Singleton();
}
}
return singleton;
}
}
当两个线程执行完第一个 singleton == null 后等待锁, 其中一个线程获得锁并进入synchronize后,实例化了,然后退出释放锁,
另外一个线程获得锁,进入又想实例化,会判断是否进行实例化了,如果存在,就不进行实例化了。
4、静态内部类
public class Singleton {
// 静态内部类LazyHolder
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
此方法既实现了线程安全,又避免了同步带来的性能影响。
还有就是类似的静态代码块实现:
public class Singleton{ // 私有构造
private Singleton() {} private static Singleton single = null; // 静态代码块
static{
single = new Singleton();
} public static Singleton getInstance() {
return single;
}
}
5、枚举类
public class SingletonFactory { // 内部枚举类
private enum EnmuSingleton{
Singleton;
private Singleton singleton; //枚举类的构造方法在类加载是被实例化
private EnmuSingleton(){
singleton = new Singleton();
}
public Singleton getInstance(){
return singleton;
}
}
public static Singleton getInstance() {
return EnmuSingleton.Singleton.getInstance();
}
} class Singleton{
public Singleton(){}
}
下面是一个单例模式使用的demo 饿汉模式
public class TestSingleton { String name = null;
private TestSingleton() {
} private static TestSingleton instance = new TestSingleton(); public static TestSingleton getInstance() {
return instance;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void print() {
System.out.println("the name is " + name);
} public static void main(String[] args) {
// TODO 自动生成的方法存根
TestSingleton ts1 = TestSingleton.getInstance();
ts1.setName("12345");
TestSingleton ts2 = TestSingleton.getInstance();
ts2.setName("56789"); ts1.print();
ts2.print();
if(ts1 == ts2){
System.out.println("创建的是同一个实例");
}else{
System.out.println("创建的不是同一个实例");
} } }
设计模式之单例模式及应用demo的更多相关文章
- 设计模式之单例模式的简单demo
/* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- 每天一个设计模式-4 单例模式(Singleton)
每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则
加载类可以使用include.require.require_once三种中的任意一种,每个关键字都有两种方法,但是这种方法的缺点是需要加载多少个php文件,就要写多少个加载类的方法.一般也就需要加载 ...
- java 23 - 2 设计模式之单例模式
单例模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? A:把构造方法私有 B:在成员位置自己创建一个对象 C:通过一个公共的方法提供访问 单例模式之饿汉式: (一进来就造对 ...
- [转]JAVA设计模式之单例模式
原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...
随机推荐
- Less常用知识点
上篇文章介绍了如何安装Less,我们将所有东西都写在.less里面,最后通过命令将.less转换成.css文件,就可以放入到项目里用了.今天了解一些less常用知识点. 1.变量:声明两个变量,一个是 ...
- oracle 报表带小计合计
selectcase when (grouping(glbm)=1) then '合计' else DECODE(glbm,null,'',glbm) end glbm,case when (grou ...
- python基础--管理目录与文件
1) 文件夹 os.listdir() #显示文件夹下所有文件 os.getcwd() #获取当前工作目录 os.chdir() #切换目录 os.mkdir() #建立目录 os.path.exis ...
- chrome调试工具怎么限制网速
在做项目的时候,我们测试的时候有时需要限制网速
- PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现
对于一般的时滞系统来说,设定值的变动会产生较大的滞后才能反映在被控变量上,从而产生合理的调节.而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以 ...
- 处理:“ORA-28002: the password will expire within 7 days”的问题
一:问题描述: 二:处理步骤 [oracle@localhost 2018_07_14]$ rlwrap sqlplus / as sysdba; SQL*Plus: Release 11.2.0.3 ...
- 本文转自 MyEclipse 2015反编译插件安装
本文转自MyEclipse 2015反编译插件安装 分享一下下载插件的地址,百度网盘:链接:http://pan.baidu.com/s/1nturiAH 密码:yk73 其次:我来说下具体操作步骤: ...
- ionic3 打包Xcode 9 Swift Language Version (SWIFT_VERSION) Ask 报错
解决方案 选择4.0 然后报错17个,类似以下这样的错误 'AVMediaTypeVideo' has been renamed to 'AVMediaType.video' 根据提示更改 AVMed ...
- Laravel 中通过自定义分页器分页方法实现伪静态分页链接以利于 SEO
我们知道,Laravel 自带的分页器方法包含 simplePaginate 和 paginate 方法,一个返回不带页码的分页链接,另一个返回带页码的分页链接,但是这两种分页链接页码都是以带问号的动 ...
- Niagara 泵阀
1.泵阀系统 2.Niagara 每次在启动workbench的时候安装一下daemon,后启动platform 启动station的时候,当station的status变成Running之后启动