`

Java设计设计模式之单例模式(Singleton)

    博客分类:
  • J2SE
阅读更多

单例模式在日常应用开发过程中被大量使用到,如在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。

 

单例模式的特点如下:

1、运行时只有一个实例供其他对象使用,同时只允许创建唯一一个实例

2、对象的初始化工作由自身来完成

3、从对象的加载方式来分,可分为乐观加载和悲观加载两种方式

 

单例模式应用的场景一般发现在以下条件下:
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。

 

设计单例类的过程中,有些人觉得分情况考虑,你可以设计成线程安全的单例模式和线程不安全的,其实在现在互联网应用满天飞的今天,养成良好的习惯,设计的时候你只考虑线程安全的会对以后的帮助比较大,至于性能方面的考虑,可以不用在乎, 毕竟通常情况下应用的性能瓶颈往往都是架构设计层面导致的,和一个小小的模块内部的实现细节有关系,但影响没有想象中的那么大。系统的核心性能问题还是要从架构层面入手去考虑设计。

 

1、乐观加载的单例模式

/**
 * 乐观加载
 * 
 * @author Administrator
 * @version $Id: Singleton.java, v 0.1 2017年3月11日 下午6:59:43 Administrator Exp $
 */
public class Singleton {

    /**  */
    private static Singleton _inst = null;

    /**
     * 乐观加载,相信在使用时加载也来得及
     * 
     * @return
     */
    public static Singleton getInstance() {
        if (_inst == null) {
            synchronized (Singleton.class) {
                _inst = new Singleton();

                System.out.println("init instance first time");
            }
        }

        System.out.println("its ready, just get it");
        return _inst;
    }

    public static void main(String[] args) {
        Singleton.getInstance();
        Singleton.getInstance();
        Singleton.getInstance();
    }
}

 

运行结果:

init instance first time
its ready, just get it
its ready, just get it
its ready, just get it

 

这种方式的优势是,在系统启动过程中减少了系统启动的时间,单例类内部的实际加载过程是在系统第一次被使用时才去完成,因此这种模式也被叫做惰性单例模式。

 

这种模式下的类实例初始化动作需要比较小心,因为初始化是在第一次使用时,因此类实例在定义时,无法定义成常量,最多只能定义成一个静态的对象,而第一次触发初始化动作的请求有可能并发进来很多,为了避免短时间内的频繁初始化带来一些不可预期的结果,在初始化的过程中需要选择在同步块中完成。

 

2、悲观加载的单例模式

/**
 * 悲观加载
 * 
 * @author Administrator
 * @version $Id: Singletonn.java, v 0.1 2017年3月11日 下午7:09:40 Administrator Exp $
 */
public class Singletonn {
    /**  */
    private static final Singleton _inst = new Singleton();

    /**
     * 乐观加载,相信在使用时加载也来得及
     * 
     * @return
     */
    public static Singleton getInstance() {

        System.out.println("its ready, just get it");
        return _inst;
    }

    public static void main(String[] args) {
        Singleton.getInstance();
    }
}

 

这种方式比较简单,对象实例的初始化是通过一个常量直接完成的,但经常需要初始化的实例往往要比我们例子复杂很多,所以会出现一些这两种方式综合使用的变种单例模式

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * 悲观加载
 * 
 * @author Administrator
 * @version $Id: Singletonn.java, v 0.1 2017年3月11日 下午7:09:40 Administrator Exp $
 */
public class Singletonn {
    /**  */
    private static final Map<String, Singleton> _inst = Collections
        .synchronizedMap(new HashMap<String, Singleton>());

    static {

        synchronized (_inst) {
            _inst.put("key1", Singleton.getInstance());
            _inst.put("key2", Singleton.getInstance());
            _inst.put("key3", Singleton.getInstance());
        }
    }

    /**
     * 乐观加载,相信在使用时加载也来得及
     * 
     * @return
     */
    public static Singleton getInstance() {
        return new Singleton();
    }

    public static void main(String[] args) {
        Singleton.getInstance();
    }
}

 

其中,静态块中的内容,我们可以理解为,是在初始化过程中需要完成的一系列的业务处理,当然这里还会有其他很多的单例类演化方式,但万变不离其宗,只要了解了基本的情况,后面的变种,只是自己在后续的实际使用场景中灵活处理的方式而已,没必要去死记这些东西。

 

各位看官,原创不易啊,转载请注明出处: http://danlley.iteye.com 看在打字不易的份上,打赏一个吧

 

参考资料:

http://blog.csdn.net/tanyujing/article/details/14160941

http://blog.csdn.net/jason0539/article/details/23297037/

 

分享到:
评论

相关推荐

    java单例模式实例

    单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们...

    大话设计模式--Singleton(单例模式)

    单例模式是软件设计模式中的一种经典模式,它在许多场景下被广泛使用,尤其是在需要全局唯一实例的情况下。本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个...

    java Singleton单例模式

    Java中的Singleton(单例模式)是一种常用的软件设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中特别有用,因为它可以节省系统资源,例如数据库连接或者线程池...

    java设计模式之单例模式.zip

    Java设计模式是面向对象编程中的重要概念,它们是软件开发中经过验证的、解决常见问题的最佳实践。在这些模式中,单例模式是最为广泛使用的一种。单例模式确保一个类只有一个实例,并提供一个全局访问点,使得在整个...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...

    Java 单例模式Singleton

    简单的单例模式举例Singleton 分为恶汉式 懒汉式

    java设计模式----单例模式

    在Java编程语言中,设计模式是一种经过验证的解决常见软件设计问题的最佳实践。单例模式是其中最常用的一种,它的核心思想是确保一个类只有一个实例,并提供全局访问点。单例模式的应用场景包括:控制资源的访问、...

    Java设计模式之单例模式的七种写法

    Java设计模式之单例模式的七种写法 单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常...

    java设计模式之——单例模式

    单例模式是软件设计模式中的一种经典模式,其主要目的是控制类的实例化过程,确保在任何情况下,一个类只有一个实例存在。这种模式通常用于管理共享资源或者全局配置,例如数据库连接池、线程池、日志服务等。在Java...

    JAVA设计模式之单例模式

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用,尤其是在需要控制实例化过程,或者确保某类只有一个实例时。本文将深入探讨Java中的单例模式,帮助你理解其原理和应用。 单例模式的核心思想是...

    设计模式 之 “单例模式[Singleton Pattern]”

    **单例模式(Singleton Pattern)**是软件设计模式中的一种基础模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接池等,这些都...

    JAVA设计模式中的单例模式

    ### JAVA设计模式中的单例模式解析 在软件工程与编程领域,设计模式是解决特定问题的一套被广泛接受的解决方案。其中,单例模式(Singleton Pattern)是一种常用的创建型模式,其核心在于确保一个类只有一个实例,...

    设计模式之单例模式源码demo

    单例模式是软件设计模式中的经典模式之一,其主要目的是控制类的实例化过程,确保在应用程序的整个生命周期中,某个类只有一个实例存在。这样的设计通常适用于那些需要频繁创建和销毁,但资源消耗较大的对象,如...

    Java的单例设计模式

    单例设计模式是软件设计模式中的经典模式之一,它的核心思想是确保一个类只有一个实例,并提供全局访问点。这种模式在Java中广泛应用于系统配置、线程池、缓存管理等场景,因为这些场景通常只需要一个共享的全局对象...

    设计模式之单例模式Java实现和类设计图

    本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...

    java设计模式之单例模式

    Java设计模式中的单例模式是一种常用的创建型设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置信息等。接下来,我们将深入探讨8种不同的单例...

    设计模式--单例模式java例子

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于可以控制实例的数量,减少资源消耗,同时便于协调整个...

    Java设计模式-单例模式详解

    Java设计模式-单例模式详解 单例模式是 Java 设计模式中的一种常用的设计模式,旨在保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的目的是为了保证在一个进程中,某个类有且仅有一个实例。 ...

    java设计模式之单例模式详解

    Java设计模式之单例模式详解 一、单例模式概览 单例模式(Singleton Pattern)是面向对象设计模式中的一种,属于创建型模式。它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。单例模式的核心在于控制...

    singleton_单例模式_java_设计模式_

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制资源的共享,减少系统开销,以及在多线程环境中避免...

Global site tag (gtag.js) - Google Analytics