单例模式
保证一个类有且只有一个实例,并提供一个访问该实例的全局访问点。要提供一个全局访问点,最常用的办法便是使用类的静态方法,静态方法只能从类而不是从实例中调用。
从理解上还是比较方便理解的,特别在想象了单例模式的实际应用情况后,当一个对象在系统中独一无二,只能有一个的时候,比如一个打印设备,一个进程管理器等等,在这上面,觉得有些类似于多线程锁的概念(所以后面会用到线程同步synchronized)
单例模式比较普遍的提到了3种形式(懒汉式,饿汉式,单例注册表)
先从最简单的单例模式开始,对照单例模式的特点,要保证该类只有一个实例,所以他的构造方法不可能是public的,必须为private(之后看到在某种需要的情况下,也可能是protect的),但是private构造函数以后,就会造成外界没办法访问,那类也就没有了本身的意义,所以,我们就需要提供一个全局访问点,也就是提供一个外界可以取得该类实例的方法,而同时为了保持实例的唯一性,我们在类的内部嵌入一个静态变量,通过检查该变量,来保证有且仅有一个。
public class Singleton {
private static Singleton singleton;//创建一个静态变量来保存类的实例
private Singleton(){}//将构造函数声明为私有,以防止外类访问,导致多次实例化
public static Singleton getInstance(){//提供一个全局访问点,返回该类的唯一实例
if(singleton==null){//检查实例是否已经存在,保证唯一性
singleton=new Singleton();
}
return singleton;
}
}
以上是最基本的单例模式实现,但是不用想也知道,肯定有很多缺陷,所以接下来是对他的改进
首先就是提到的线程安全,所以我们在构造方法上加上synchronized
public synchronized static Singleton getInstance(){
……
}
这样改进以后就是所谓的懒汉式了
当然还有另外一个办法保证不会同时2个线程创建了2个实例,就是将实例化提前,在静态变量声明的时候就同时实例化
public class Singleton {
private static Singleton singleton=new Singleton();//提前实例化
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
这个也就是饿汉式单例模式
再补充一个看到的双重锁(double-checked locking)
public class Singleton{
private volatile static Singleton singleton; //注意volatile
private Singleton(){}
public static Singleton getInstance(){
if(singleton==null){
synchronized(Singleton.class){//双重锁
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
从网上看到的情况是,在不同的classloader或者虚拟机JVM下,可能会造成结果的不可预知,所以加了2重锁
然后查了一下volatile关键字,也是为了这个目的,声明为volatile的变量就是可能产生不可预知结果的,volatile保证变量总是从内存中拿去(好像是这样,谁能再补充下,也可能我理解不对)
最后是单例注册表
单例注册表就是将创建的实例放入到一个注册表中(HashMap),然后每次去注册表中查找实例是否被创建,同样是为了保证唯一性,而这样一个机制,个人理解类似于一个打印机请求的情况,多个打印请求1台打印机,每次只能打印(实例化)一个
另外看到还有用反射机制的,没有研究。。
这些基本就是我对单例模式的了解,有错误的地方,希望指出
分享到:
相关推荐
【Java学习笔记——全面解析】 Java作为一种广泛应用的高级编程语言,是软件开发领域的核心力量。这份"学习笔记——资料"涵盖了Java学习的各个方面,旨在帮助初学者和有经验的开发者巩固基础,提升技能。以下是对这...
【Java学习笔记——良葛格】是一份由爱好者良葛格整理的Java学习资料,主要以PDF格式呈现,虽然可能不完整,但包含了丰富的Java编程基础知识和实践技巧,旨在为初学者提供一个学习和参考的平台。以下是笔记中可能...
最近在设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二...
首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一反应应该是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有...
12. **设计模式**:设计模式是解决常见软件设计问题的经验总结,如单例模式、工厂模式、观察者模式等,熟练掌握设计模式可以提高代码质量和可维护性。 13. **框架应用**:Spring、MyBatis、Hibernate等框架极大地...
下面将详细讨论在给定文件中提及的两种模式——单例模式和工厂模式。 ### 单例模式 单例模式确保一个类只有一个实例,并提供全局访问点。这种模式在资源管理、缓存、日志记录等方面非常有用。在Java中,单例模式有...
10. **单例模式**:《设计模式(Design Pattern) —— 单例模式(Singleton).mht》介绍了设计模式中的单例模式,这是一种确保类只有一个实例并提供全局访问点的设计模式,常用于配置管理、缓存等场景。 通过这些学习...
在本笔记中,我们将探讨设计模式的核心概念,并通过具体的例子——`PizzaIngredientFactory`来实践这些模式。 首先,设计模式分为三大类:创建型、结构型和行为型模式。创建型模式关注对象的创建,如单例模式...
"Java入门第三季学习笔记"可能涵盖了更多高级话题,如反射、注解、设计模式和Java库的使用。反射允许程序在运行时检查类、接口、字段和方法的信息,提供了更大的灵活性。注解是一种元数据,可以用来提供编译器或运行...
该压缩包文件提供了丰富的UML学习资源,包括两本CHM格式的电子书——"23种经典设计模式UML类图汇总"和"UML图例子",以及可能包含的学习笔记,帮助初学者和经验丰富的开发者深入理解和应用UML。 1. **23种经典设计...
这份压缩包包含了博主在学习过程中记录的详细笔记,以及一份精心整理的设计模式表格,旨在帮助备考者系统、高效地掌握相关知识。 首先,我们来探讨一下“软考”——这是一项国家级的专业技术资格认证考试,旨在评测...
8. **设计模式**:C++的课件可能还会涉及常见的设计模式,如工厂模式、单例模式、观察者模式等,这些模式在实际开发中非常有用。 9. **调试与性能优化**:学习如何利用调试工具找出并修复程序中的错误,以及如何...
在阅读源码时,我们需要注意代码的组织结构、模块化设计以及异常处理,同时还要理解各种设计模式的运用,如单例模式、工厂模式等。此外,调试技巧也是源码分析的关键,学会使用断点、日志打印、性能分析工具等将极大...
首先,Spring中广泛运用了两种设计模式:工厂模式和单例模式。工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在Spring框架中,工厂模式体现在Spring容器(BeanFactory或ApplicationContext)中,...
例如,单例模式确保一个类只有一个实例,工厂模式提供了一种创建对象的最佳方式,而观察者模式允许对象之间建立一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。...
【Spring入门笔记】主要介绍了Spring框架的基础知识,包括Spring的核心概念、Bean的配置与作用域、依赖注入、SpringAop和SpringJdbc,以及事务声明。以下是对这些知识点的详细说明: 1. **什么是Spring?** Spring...
本课程笔记主要涵盖了软件架构的重要概念、设计模式、评估标准以及实际应用,旨在帮助学习者深入理解并掌握软件架构设计的核心知识。 一、软件体系结构基本概念 软件体系结构是软件系统的高级构造,它描述了系统的...
### Java学习笔记——设计模式与基础概念解析 #### 一、设计模式概述 设计模式是在软件开发过程中,针对常见的问题提出的经过验证的解决方案。这些模式是开发者们在长期实践中不断提炼和完善的结果,能够帮助...
MFC的设计遵循了设计模式中的许多原则,如单例模式(Singleton)、工厂模式(Factory)和观察者模式(Observer)。 **文档/视图架构** MFC中的核心设计是文档/视图(Document/View)架构,这是一种分离数据(文档)...
枚举在设计模式中的单例模式、策略模式等有广泛应用。 增强的for循环(也称为foreach循环)是Java 5.0的另一大亮点。它简化了遍历数组和集合的操作,使得代码更加简洁易读,如:`for (Type item : collection) { .....