一、单例模式要点
1.单例,顾名思义,某个类只能有一个实例。
2.它必须自行创建这个唯一的实例。
3.它必须自行向整个系统提供这个实例。
二、单例模式的三种实现
1.饿汉式单例类(类加载时就初始化)
public class EagerSingleton {
//私有的类成员常量
private static final EagerSingleton SINGLETON=new EagerSingleton();
//私有的默认构造方法,此类不能被继承
private EagerSingleton(){}
//静态工厂方法
public static EagerSingleton getInstance(){
return SINGLETON;
}
}
Java语言中的单例类的一个最重要的特点是类的构造方法是私有的,从而避免外界利用构造方法直接创建出人意多飞实例。
2.懒汉式单例类(第一次调用才初始化,延迟)
public class LazySingleton {
private static LazySingleton singleton=null;
//私有的默认构造方法,此类不能被继承
private LazySingleton(){}
//同步,静态工厂方法,返回此类的唯一实例
public synchronized static LazySingleton getInstance(){
if(singleton==null){
singleton=new LazySingleton();
}
return singleton;
}
}
对2的懒汉式的另外一种改进
public class DoubleCheckSingleton {
private volatile static DoubleCheckSingleton singleton = null;
// 私有的默认构造方法,此类不能被继承
private DoubleCheckSingleton() {
}
// 静态工厂方法,返回此类的唯一实例
public static DoubleCheckSingleton getInstance() {
if (singleton == null) {
synchronized (DoubleCheckSingleton.class) {
if (singleton == null) {
singleton = new DoubleCheckSingleton();
}
}
}
return singleton;
}
}
3.登记式单例类
登记式单例类是为了克服饿汉式单例类和懒汉式单例类不可继承的缺点而设计的。
package com.zzs.singleton;
import java.util.HashMap;
public class RegSingleton {
private static HashMap registry=new HashMap();
/**静态代码块
*静态代码块优先于主方法执行,而在类中定义的静态代码会优先于构造块执行,而且不管产生多少对象,静态代码块只执行一次。
*/
static{
RegSingleton singleton=new RegSingleton();
registry.put(singleton.getClass().getName(), singleton);
}
protected RegSingleton(){}
public static RegSingleton getInstance(String name){
if(name==null){
name="com.zzs.singleton.RegSingleton";
}
if(registry.get(name)==null){
try {
registry.put(name, Class.forName(name).newInstance());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return (RegSingleton) registry.get(name);
}
}
package com.zzs.singleton;
public class RegSingletonChild extends RegSingleton {
//由于子类必须允许父类以构造方法调用产生实例,所以它的构造方法必须是公开的,protected或public
protected RegSingletonChild() {
}
//静态方法工厂
public static RegSingletonChild getInstance() {
return (RegSingletonChild) RegSingleton
.getInstance("com.zzs.singleton.RegSingletonChild");
}
}
三、在什么情况下使用单例模式
使用单例模式的一个必要条件:在一个系统中要求只有一个类的实例时应当使用单例模式。反过来说,如果一个类可以有几个实例共存,那么就没有必要使用单例类。java语言中的Runtime对象就是一个单例模式。
分享到:
相关推荐
Java设计模式之单例模式的七种写法 单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个...懒汉式单例是一种常见的单例模式实现方式,它有四种写法,每种写法都有其优缺。
这种实现方式被认为是线程安全且高效的单例模式实现。 总结来说,单例模式在Java中的实现涉及到多线程同步、内存模型以及性能优化等多个方面。理解并熟练掌握各种单例模式的实现方式,有助于我们编写出更加健壮、...
单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...
本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...
"设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...
单例模式是软件设计模式中的一种经典模式,其主要目的是控制类的实例化过程,确保在程序运行过程中,对于某个类,全局只有一个实例存在。这种模式在资源管理、配置对象或者全局缓存等场景中非常常见。在ActionScript...
单例模式有多种实现方式,其中比较常见的有饿汉式、懒汉式、双重检查锁定等。 工厂设计模式是一种创建型设计模式,它的主要目标是将对象的创建和使用分离,使得代码更具有可维护性和可扩展性。该模式通常会定义一个...
实现单例模式主要有两种方式:饿汉式和懒汉式。 ### **饿汉式单例模式** 饿汉式单例模式在类加载时就完成了实例化,因此也称为静态初始化。这种方式保证了线程安全,但可能会造成不必要的资源浪费,因为即使未使用...
单例模式是软件设计模式中...在实际开发中,应根据项目需求和环境选择合适的单例模式实现。在设计模式中,单例模式不仅限于上述实现,还可以与其他模式结合使用,如工厂模式、装饰器模式等,以达到更灵活、高效的设计。
目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...
主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免使用反射方法获取多个实列,以及实现了序列化的类如何避免创建...
单例模式是软件设计模式中的一种基础模式,它在Java编程中被广泛应用。单例模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式可以有效地控制资源的使用,限制实例的数量,提高性能,尤其是在...
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供全局访问点。这种模式在许多场景下非常有用,比如控制共享资源、管理系统级别的对象,如数据库连接池或者线程池等。单例模式的核心在于限制类的...
单例模式是软件开发中常用的设计模式之一,用于确保一个类只有一个实例,并提供一个全局访问点。Java中实现单例模式的方法有很多种,每种方法都有其适用场景和优缺点。选择合适的实现方式需要根据实际需求和应用场景...
以上就是Java中常见的单例模式实现方式,每种方式都有其适用场景和优缺点。在实际开发中,应根据项目需求和环境选择合适的方法。例如,如果对性能要求较高,可能会选择静态内部类或枚举方式;如果需要考虑序列化问题...
在实际开发中,根据项目需求和性能考虑,可以选择最适合的单例模式实现。例如,如果资源消耗不大且对性能要求较高,可以考虑饿汉式;如果希望在真正需要时才创建实例,可以选择懒汉式或双重验证式;如果希望兼顾延迟...
通过研磨设计模式之单例模式的资料,你可以深入理解单例模式的原理、实现方式及其优缺点,进一步提升自己的编程技能和设计思维。学习并熟练掌握设计模式,对于成为一名优秀的Java开发者至关重要。