JAVA单例模式的几种实现方法
1.饿汉式单例类
package pattern.singleton;
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
//私有的默认构造子
private Singleton1() {}
//已经自行实例化
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
2.懒汉式单例类
package pattern.singleton;
//懒汉式单例类.在第一次调用的时候实例化
public class Singleton2 {
//私有的默认构造子
private Singleton2() {}
//注意,这里没有final
private static Singleton2 single;
//只实例化一次
static{
single = new Singleton2();
}
//静态工厂方法
public synchronized static Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}
在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里建议使用
所谓的"双重检查成例".必须指出的是,"双重检查成例"不可以在Java 语言中使用。不十分熟悉的读者,可以看看后面
给出的小节。 同样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例化。即
便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍
差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,必须处 理好在多个
线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源
初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。
饿汉式单例类可以在Java 语言内实现, 但不易在C++ 内实现,因为静态初始化在C++ 里没有固定的顺序,因而
静态的m_instance 变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么GoF 在提出单例类的概念
时,举的例子是懒汉式的。他们的书影响之大,以致Java 语言中单例类的例子也大多是懒汉式的。实际上,本书认为
饿汉式单例类更符合Java 语言本身的特点。
3.登记式单例类.
package pattern.singleton;
import java.util.HashMap;
import java.util.Map;
//登记式单例类.
//类似Spring里面的方法,将类名注册,下次从里面直接获取。
public class Singleton3 {
private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
static{
Singleton3 single = new Singleton3();
map.put(single.getClass().getName(), single);
}
//保护的默认构造子
protected Singleton3(){}
//静态工厂方法,返还此类惟一的实例
public static Singleton3 getInstance(String name) {
if(name == null) {
name = Singleton3.class.getName();
System.out.println("name == null"+"--->name="+name);
}
if(map.get(name) == null) {
try {
map.put(name, (Singleton3) Class.forName(name).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return map.get(name);
}
//一个示意性的商业方法
public String about() {
return "Hello, I am RegSingleton.";
}
public static void main(String[] args) {
Singleton3 single3 = Singleton3.getInstance(null);
System.out.println(single3.about());
}
}
分享到:
相关推荐
### JAVA中单例模式的几种实现方式 #### 1. 线程非安全的基本实现方式 单例模式是设计模式中的一种常用形式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式可以通过多种方式来...
### Java多线程编程环境中单例模式的实现 #### 概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式的应用非常广泛,特别是在资源管理、日志记录、...
在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...
java 中单例模式饿汉式与懒汉式的对比 java 中单例模式是保证一个类仅有一个实例,并提供...java 中单例模式饿汉式与懒汉式的对比可以帮助我们更好地理解和应用单例模式,并在实际开发中选择合适的单例模式实现方式。
单例设计模式在Java中是一种广为应用的设计模式,它的核心在于将类的构造方法私有化,从而实现对类实例化过程的控制。这种模式确保了在一个应用程序中,某个类只能产生一个实例对象,有助于限制对象的数量,并且能够...
在Java中,实现单例模式主要有三种方式:懒汉式、饿汉式和登记式。 **懒汉式单例**: 懒汉式单例的特点是在类第一次被使用时才创建实例,延迟加载,以节省资源。然而,非线程安全的懒汉式单例在多线程环境下可能...
Kotlin 中单例模式和 Java 中单例模式的实现方式有所不同,但都是为了实现单例模式的目的。Kotlin 中的单例模式实现方式更加简洁和优雅,使用 object 声明和 lazy 函数可以实现懒加载和线程同步单例。
下面将详细介绍7种不同的Java单例模式实现方式: 1. **懒汉式(非线程安全)**: 这是最简单的实现,延迟初始化,但在多线程环境下可能出现多个实例。代码如下: ```java public class Singleton { private ...
单例模式的实现通常包含以下几个关键点: 1. **构造函数私有化**:通过将构造函数设为`private`,阻止外部通过`new`关键字直接创建对象。这样确保了外部无法实例化单例类,只能通过预定义的方法来获取单例实例。 2...
在C++编程领域,设计模式是解决特定问题的模板,其中单例模式(Singleton Pattern)是一种常用的创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。然而,在C++中实现单例模式时,如何正确管理这个...
### 基于Python中单例模式的几种实现方式及优化详解 #### 一、单例模式概述 单例模式(Singleton Pattern)是面向对象设计模式中的一种,其主要目标是在整个应用程序中确保一个类只有一个实例,并提供一个全局访问...
Python 的模块就是天然的单例模式,下面这篇文章主要给大家介绍了关于python中单例常用的几种实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用python单例具有一定的参考学习价值,需要的朋友们一起来...
"Java中单表和多表级联的增删改查"这个主题涵盖了基础的数据库操作以及更复杂的关联查询技术。以下是对这些知识点的详细解释: 1. **单表的增删改查(CRUD)**: - **Create(创建)**: 在Java中,通常使用JDBC...
首先向关注过我这个系列...这立刻让我想到了最常用也是最简单最容易理解的一个设计模式 单例模式 何为 单例模式 ? 故名思议 即 让 类 永远都只能有一个实例。 由于 示例代码 比较简单 我也加了注释,这里就不在赘述
以下是Java实现的六种单例模式的详细解释: 1. 懒汉式(Lazy Initialization): 这种方式延迟了单例对象的初始化,直到第一次被请求时。例如,`SingleInstance1.java`可能就实现了这种方式。代码通常包含一个私有...
在Java中,实现单例模式通常有两种方式:饿汉式单例和懒汉式单例。 **饿汉式单例**: 饿汉式单例在类加载时就完成了初始化,因此类加载时间较长,但获取实例的速度非常快,且线程安全。代码如下: ```java public ...
android SQLite DBHelper 单例模式 实现 dbhelper=DBHelper.getInstance(this);
一、单例模式的四种实现方法: 1. 类方法实现: 在Python中,可以定义一个类方法来实现单例。类方法`instance()`检查类属性`_instance`是否已存在,如果不存在,则创建一个新的实例并将其存储。这样,每次调用`...