一、单例模式要点
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对象就是一个单例模式。
分享到:
相关推荐
设计模式-单例模式(讲解及其实现代码)
单例模式有多种实现方式,其中比较常见的有饿汉式、懒汉式、双重检查锁定等。 工厂设计模式是一种创建型设计模式,它的主要目标是将对象的创建和使用分离,使得代码更具有可维护性和可扩展性。该模式通常会定义一个...
用ActionScript3实现的单例模式
目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...
设计模式之装饰模式Java实现和UML类设计图
主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免使用反射方法获取多个实列,以及实现了序列化的类如何避免创建...
单例模式和工厂模式结合应用,实现了产品的生产,适合用做课程设计,包含详细文档和代码。Java语言。喜欢的可以下载来看看那
java单例模式的实现方式
单例模式主要有懒汉式和饿汉式两种实现,饿汉式不会有线程安全的问题,但是提前构造对象占用了一定的资源,如果对内存要求较低的场景可以使用饿汉式实现;懒汉式应使用DCL机制来避免多线程竞争资源的问题,并且懒汉...
设计模式之单例模式,单列模式的几种实现形式,以及其优缺点,还有就是示例,对初步了解单列模式的有所帮助
设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试
本文实例讲述了JS 设计模式之:单例模式定义与实现方法。分享给大家供大家参考,具体如下: 良好的设计模式可以显著提高代码的可读性,降低复杂度和维护成本。笔者打算通过几篇文章通俗地讲一讲常见的或者实用的设计...
单例的三种实现方式,详细的注释,预备知识
基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等 Java设计模式共有23种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式...
2021年全面详细介绍6种方式实现单例模式,Java语言实现。
3. 单例模式的7种实现方式 5 3.1饿汉式(使用静态常量) 5 3.2饿汉式(使用静态代码块) 7 3.3懒汉式(线程不安全) 8 3.4懒汉式(线程安全,使用同步方法) 9 3.5双重检查实现单例模式 10 3.6使用静态内部类实现...
Python 115.设计模式_单例模式实现.mp4
c++设计模式-创建型模式-单例模式源码,懒汉式 饿汉式源码,qt工程,单例模式线程安全问题,单例模式实现方式
场景描述 单例模式对于我们来说一点也不模式,是一个常见的名称,单例...单例模式实现方式有:饿汉式、懒汉式、双重验证式、静态内部类 下面分别对每一种实现方式做一个简单的实例,以及其优缺点 饿汉式 /// <summary>
设计模式的研究以及单例模式的应用与实现,王晓满 ,张展华,本文介绍了设计模式在软件设计中的重要作用和意义,然后给出了设计模式的定义和基本要素,在此基础之上分析了怎样使用设计模式来