`
chendang1314
  • 浏览: 104014 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

singleton 模式初识

 
阅读更多
SINGLETON模式
一、 引言
想学习关系线程安全方面的,引申到singleton模式,知道这个模式,还是想系统的先弄明白.
二、 定义与结构
 单例类只有一个实例
 单例类必须自己创建自己的唯一的实例
 例类必须给所有其他对象提供这个唯一的实例
三、 实现方式
引用java与模式中的三种实现方式。

第一种;饿汉式单例类
构造方法私有,避免外界利用构造方法随意的创建实例,因此这个类也不能被继承。单实例在类装载时初始化。

public class EagerSingleton {
    private EagerSingleton() { }

    public static EagerSingleton getInstance() {
        return m_instance;
    }

    /** @label Creates */
    private static final EagerSingleton m_instance = new EagerSingleton();
}

第二种:懒汉式单例类
此构造方法也为私有,同样不能被继承。在类首次实例化时创建,需要处理好多个线程首次同时引用此类时的 访问限制问题。
public class LazySingleton
{
    private LazySingleton() { }

    synchronized public static LazySingleton getInstance()
    {
	    if (m_instance == null)
	    {
	        m_instance = new LazySingleton();
	    }
	    return m_instance;
	}

    /**
     * @label Creates 
     */
    private static LazySingleton m_instance = null;
}

第三种:登记式单例

import java.util.HashMap;

public class RegSingleton {

    protected RegSingleton() {}

    static public RegSingleton getInstance(String name)
    {
        if (name == null)
        {
            name = "com.javapatterns.singleton.demos.RegSingleton";
        }

        System.out.println("From RegSingleton: requesting for " + name );

        if (m_registry.get(name) == null)
        {
            try
            {
                m_registry.put( name, Class.forName(name).newInstance() ) ;
            }
            catch(ClassNotFoundException e)
            {
                System.out.println("Class " + name + " is not found.");
            }
            catch(InstantiationException e)
            {
                System.out.println("Class " + name + " can not be instantiated.");
            }
            catch(IllegalAccessException e)
            {
                System.out.println("Class " + name + " can not be accessed.");
            }
        }
        return  (RegSingleton) (m_registry.get(name) );
    }

    static private HashMap m_registry = new HashMap();

    /**
     * @label Creates
     * @directed*/
    /*# private RegSingletonChild lnkRegSingletonChild; */

    /**
     * @label Creates
     * @directed
     */
    /*# private RegSingleton lnkRegSingleton;  */

    static
    {
        RegSingleton x = new RegSingleton();
        m_registry.put( x.getClass().getName() , x);
    }

    public String about()
    {
        return "Hello, I am RegSingleton.";
    }

}

由于构造方法非私有,子类可以继承,继承必须通过getInstance方法传入子类的类名。
import java.util.HashMap;
public class RegSingletonChild extends RegSingleton
{
    public RegSingletonChild() {}

    static public RegSingletonChild getInstance()
    {
        return (RegSingletonChild) RegSingleton.getInstance( "com.javapatterns.singleton.demos.RegSingletonChild" );
    }

    public String about()
    {
        return "Hello, I am RegSingletonChild.";
    }

}

缺点是在子类产生的实例可以不在父类中登记,其次是子类的实例的产生必须是父类的实例存在才能产生


四、 实例
如上
属性管理器
import java.util.Properties;
import java.io.FileInputStream;
import java.io.File;

/**
* Only once instance of the class may be created during the
* execution of any given program. Instances of this class should
* be aquired through the getInstance() method. Notice that there
* are no public constructors for this class.
*/
public class ConfigManager
{
   /**
	* The private constructor (enforces single instance)
	*/
	private ConfigManager()
	{
		m_file = new File(PFILE);
		m_lastModifiedTime = m_file.lastModified();

		if(m_lastModifiedTime == 0)
		{
            System.err.println(PFILE + " file does not exist!");
        }

		m_props = new Properties();

		try
		{
			m_props.load(new FileInputStream(PFILE));
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

	/**
	* Returns the singleton ConfigManager
	*
	* @return The one and only instance of the ConfigManager
	*/
	synchronized public static ConfigManager getInstance()
	{
		return m_instance;
	}

	/**
	* Gets a configuration item
	*
	* @param name The name of the item
	* @param defaultVal The default value if name is not found
	* @return The value for the specified name
	*/
	final public Object getConfigItem(String name, Object defaultVal)
	{
		long newTime = m_file.lastModified();

		// Check to see if configuration file has been modified
		// since the previous request. If so, then read in the new
		// contents
		if(newTime == 0)
		{
			// The props file was deleted or does not exist (!!)
			if(m_lastModifiedTime == 0)
            {
				System.err.println(PFILE + " file does not exist!");
            }
			else
            {
				System.err.println(PFILE + " file was deleted!!");
            }
			return defaultVal;
		}
		else if(newTime > m_lastModifiedTime)
		{
			m_props.clear();	// Get rid of the old properties
			try
			{
				m_props.load(new FileInputStream(PFILE));
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		m_lastModifiedTime = newTime;

		Object val = m_props.getProperty(name);
		if( val == null )
        {
			return defaultVal;
        }
		else
        {
			return val;
        }
	}

	/**
	* The fully qualified name of the properties file
	*/
	private static final String PFILE = System.getProperty("user.dir") +  "/Singleton.properties";

	/**
	* The File object corresponding to the file that contains the properties
	*/
	private File m_file = null;

	/**
	* The last modified time of the properties file
	*/
	private long m_lastModifiedTime = 0;

	/**
	* The cached properties
	*/
	private Properties m_props = null;

	/**
	* The only instance of this class
	* @label Creates
	*/
	private static ConfigManager m_instance = new ConfigManager();


五、 总结
分享到:
评论

相关推荐

    C++完美实现Singleton模式

    ### C++中实现Singleton模式的关键知识点 #### 一、Singleton模式简介 Singleton模式是一种常用的软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中经常被用于控制对共享资源...

    C++ 实现的singleton 模式

    **C++实现的Singleton模式详解** Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源,如数据库连接池,或者确保某个...

    Java的Singleton模式代码(免资源分)

    ### Java的Singleton模式详解 #### 一、Singleton模式概述 Singleton模式是一种常用的设计模式,在Java中主要用于确保一个类只有一个实例,并提供一个全局访问点。这种模式对于管理共享资源(如数据库连接池、...

    (创建型模式)Singleton模式

    Singleton模式是设计模式中的一种创建型模式,它在软件工程中扮演着重要的角色。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。Singleton模式的应用场景通常涉及到系统...

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

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

    最简单的设计模式学习Singleton模式

    ### 最简单的设计模式学习:Singleton模式 #### 一、Singleton模式简介 Singleton(单例)模式是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在许多场合下非常...

    设计模式 创建型模式 Singleton模式(单键)

    Singleton模式: 确保一个类只有唯一的一个实例。 Singleton主要用于对象的创建,这意味着,如果某个类采用了Singleton模式,则在这个类被创建后,它将有且仅有一个实例可供访问。很多时候我们都会需要Singleton...

    C#设计模式之Singleton模式

    《C#设计模式之Singleton模式详解》 Singleton模式是软件设计模式中的一种基础模式,它在众多设计模式中占有重要地位,尤其在C#编程中经常被应用。Singleton模式的主要目的是确保一个类只有一个实例,并提供一个...

    Singleton模式源程序

    Singleton模式是一种设计模式,它是创建型模式的一种,用于控制类的实例化过程,确保一个类在整个应用程序中只有一个实例存在。这种模式在系统中需要频繁创建和销毁对象,且对象需要共享资源时非常有用,比如配置...

    Java线程安全的Singleton模式:深入分析与实现

    在Java编程中,Singleton模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。线程安全的Singleton模式对于多线程环境尤为重要,因为它可以防止多个线程同时创建多个实例。本文将详细介绍...

    Qt qml Singleton 单例模式

    在Qml中,我们可以通过Qt的Singleton组件来实现这一模式。 首先,让我们理解单例模式的基本概念。在软件工程中,单例模式保证一个类只有一个实例,并提供一个全局访问点。这个设计模式在许多场景下都很实用,比如...

    Singleton模式

    Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这个模式在许多场景下非常有用,比如配置管理、日志服务、线程池等,需要确保全系统内只有一个对象来处理特定任务的情况...

    java Singleton单例模式

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

    深入浅出单例Singleton模式

    【深入浅出单例Singleton模式】 单例模式是一种在软件设计中常见的设计模式,它的核心目标是确保一个类只有一个实例,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于控制资源的共享,如全局...

    singleton设计模式java实现及对比

    **Singleton设计模式** Singleton设计模式是软件工程中最常用的设计模式之一,它的主要目的是确保一个类只有一个实例,并提供全局访问点。在Java中,Singleton模式的实现有多种方式,每种方式都有其优缺点,我们将...

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    Singleton模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种模式在需要控制资源的唯一性或者全局访问点时非常有用,比如数据库连接、线程池或者缓存管理等。 ...

    单例模式Singleton(java源码)

    Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()...

Global site tag (gtag.js) - Google Analytics