`

设计模式之创建类模式—单例模式

    博客分类:
  • java
阅读更多
单例模式是一个比较简单的模式。

定义:

确保某一个类只有一个实例,而且自动实例化并向整个系统提供这个实例。



通用代码:

Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的。
/**
* 线程安全的单例模式
* 饿汉式单例
* @author Administrator
*
*/
public class Singleton {
    
    private static final Singleton singleton = new Singleton();
    
    // 限制产生多个对象
    private Singleton() {
    }
    
    // 通过该方法获得实例对象
    public static Singleton getSingleton() {
        return singleton;
    }
    
    // 类中其他方法尽量是static
    public static void doSomething() {
        
    }
}

单例模式的优点:
1.由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显了。
2.由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决。
3.单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
4.单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

单例模式的缺点:
1.单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
2.单例模式对测试是不利的。在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能用mock的方式虚拟一个对象。
3.单例模式与单一职责原则有冲突。一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,单例模式把“要单例”和业务逻辑融合在一个类中。

单例模式的使用场景:
1.要求生成唯一序列号的环境;
2.在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;
3.创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源;
4.需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为static的方式)。


单例模式的注意事项:

  1.  在高并发情况下,请注意单例模式的线程同步问题。

/**

 * 懒汉式单例

 * @author Administrator

 *

 */

public class Singleton2 {

 

    private static Singleton2 singleton = null;

 

    // 限制产生多个对象

    private Singleton2() {

    }

 

    // 通过该方法获得实例对象

    public static Singleton2 getSingleton() {

        synchronized (singleton) {

            if (singleton == null) {

                singleton = new Singleton2();

            }

        }

        return singleton;

    }

}



/**

如果不加synchronized进行控制,如果第一个线程A执行到singleton = new Singleton2(),但还没有获得对象,第二个线程B也在执行,执行到if (singleton == null)判断,那么线程B获得判断条件为真,于是继续运行下去,线程A和B都获得了对象,内存中就出现了两个对象。
 
建议使用饿汉式单例,那是线程安全的单例模式。

  2.  需要考虑对象的复制情况。在Java中,若实现Cloneable接口,并实现了clone方法,则可以直接通过对象复制方式创建一个新对象,对象复制是不用调用类的构造函数的。

3.  注意JVM的垃圾回收机制,如果我们的一个单例对象在内存中长久不使用,JVM就认为这是一个垃圾对象,在CPU资源空闲的情况下该对象会被清理掉,下次再调用时就需要产生一个新对象。如果该对象作为有状态值的管理,则会出现状态恢复原状的情况,就会出现故障。

有两种方法可以解决该问题
 
1、由容器管理单例的生命周期
 
Java EE容器或者框架级容器(如Spring)可以让对象长久驻留内存。
 
2、状态随时记录
 
可以使用异步记录的方式,或者使用观察者模式,记录状态的变化,写入文件或写入数据库中,确保即使单例对象重新初始化也可以从资源环境获得销毁前的数据,避免应用数据丢失。


单例模式的扩展:
 
能产生固定数量实例的单例模式


/**

 * 能产生固定数量实例的单例模式

 * @author Administrator

 *

 */

public class Singleton3 {

 

    // 最多能产生的实例数

    private static int maxNumOfSingleton = 2;

 

    // 定义一个列表,容纳所有实例

    private static ArrayList<Singleton3> singletonList = new ArrayList<Singleton3>();

 

    // 产生所有对象

    static {

        for (int i = 0; i < maxNumOfSingleton; i++) {

            singletonList.add(new Singleton3());

        }

    }

 

    // 限制其他类生成对象

    private Singleton3() {

    }

 

    // 随机获得一个实例

    public static Singleton3 getInstance() {

        Random random = new Random();

        return singletonList.get(random.nextInt(maxNumOfSingleton));

    }

 

}
  • 大小: 32.4 KB
分享到:
评论

相关推荐

    设计模式单例模式和工厂模式综合应用

    "设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...

    设计模式之单例模式(结合工厂模式)

    单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...

    设计模式——单例模式

    单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于控制共享资源,如数据库连接池、线程池或者日志系统等,确保这些资源在整个应用程序中只被创建一次。 单例模式的核心...

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

    单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个全局访问点。这种模式常用于控制资源的共享,如数据库连接、线程池或配置对象等。在Java中,实现单例模式有多种方法,包括懒汉式...

    设计模式单例模式

    单例模式是软件设计模式中的一种基础且广泛应用的模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要频繁创建和销毁对象,且对象创建成本较高,或者需要共享资源的情况下非常...

    23钟设计模式之单例模式

    单例模式是一种常用的设计模式,它的核心思想是在整个应用程序中,一个类只能有一个实例存在。单例模式常用于控制资源的共享,例如数据库连接池、日志服务等。单例模式有多种实现方式,常见的包括懒汉式、饿汉式以及...

    Java 单例模式 工具类

    Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...

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

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

    单例设计模式的优缺点和设计思想

    单例设计模式是一种在软件工程中广泛使用的创建型设计模式,其核心思想是确保一个类仅有一个实例,并提供一个全局访问点。这种模式在多种场景下具有显著的优势,同时也存在一定的局限性和潜在的问题。 ### 单例设计...

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

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

    Java设计模式之单例模式

    单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它自己负责创建自己的对象...

    Java设计模式之单例模式讲解

    主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免使用反射方法获取多个实列,以及实现了序列化的类如何避免创建...

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供全局访问点。在单例模式中,类的构造函数是私有的,防止外部直接创建对象,而是通过静态方法获取该类的唯一实例。单例模式的唯一性通常是在进程范围内,...

    单例设计模式.pdf

    单例设计模式是一种在软件设计中广泛使用的设计模式,它属于创建型模式,其核心目标是确保类只有一个实例,并提供一个全局访问点。这个模式在Java中尤其常见,因为Java的垃圾回收机制允许对象长时间驻留在内存中,...

    设计模式C++学习之单例模式(Singleton)

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于...

    设计模式之单例模式

    单例模式是软件设计模式中的一种经典模式,它在许多实际场景中被广泛使用,尤其在需要控制类的实例只有一个的情况下。单例模式确保无论在程序的任何地方,只要通过特定方式请求创建该类的对象,始终只会返回同一个...

    java单例设计模式的好处

    单例设计模式是软件开发中一种重要的设计模式,它的核心思想是确保一个类只有一个实例,并提供全局访问点。在Java中,单例模式通常用于控制特定类的实例化过程,以达到节省系统资源、控制并发访问和实现数据共享等...

    Qt单例设计模式(1-8)

    本系列教程将会逐步介绍如何创建和使用Qt单例模式,从基本的实现到更复杂的场景应用,帮助开发者掌握这一重要的设计模式,提高代码的复用性和可维护性。通过学习和实践,你将能够更好地理解和运用Qt中的单例设计模式...

    Java的单例设计模式

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

    javaweb项目+设计模式(单例模式,工厂模式,动态代理,适配器)

    单例模式是一种限制类实例化次数为一个的设计模式,常用于全局共享对象,如数据库连接池、线程池等。在Java中实现单例模式有多种方法,包括懒汉式(线程不安全)、饿汉式(线程安全)、双重检查锁定(DCL,线程安全...

Global site tag (gtag.js) - Google Analytics