`
geelong
  • 浏览: 117153 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

单例模式 转

阅读更多

单例模式单例模式是一种常见的设计模式,
单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有一下特点:
1、 单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。

一、懒汉式单例在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。

单例模式-懒汉式单例

package Singleton;

public class LazySingleton {
	/*** 私有静态对象,加载时候不做初始化      */    
	   private static
 LazySingleton m_intance=null;     
	    /*** 私有构造方法,避免外部创建实例      */    
并不是完全不能创建

	    private
 LazySingleton(){}    
	    /*** 静态工厂方法,返回此类的唯一实例.* 当发现实例没有初始化的时候,才初始化. * @return LazySingleton */    
	   public static synchronized 
 LazySingleton getInstance(){
	        if(m_intance==null){
	           m_intance=new LazySingleton();
	         }
	         return m_intance;
	    }
	

	public static void main(String[] args) {
		LazySingleton lazySingleton = LazySingleton.getInstance();  
		LazySingleton lazySingleton1 = LazySingleton.getInstance();
		LazySingleton lazySingleton2= new LazySingleton();
		  if(lazySingleton==lazySingleton1){
		   System.out.println(" 同一个对象实例");
		  }else{
		   System.out.println("不是同一个对象实例");
		  }
//		  同一个对象实例

		  
		  if(lazySingleton==lazySingleton2){
			   System.out.println(" 同一个对象实例");
			  }else{
			   System.out.println("不是同一个对象实例");
			  }
//		  不是同一个对象实例

没有构造方法也能new

		  
	}
}
 


public class LazySingleton {    
   /*** 私有静态对象,加载时候不做初始化      */    
   private static LazySingleton m_intance=null;     
    /*** 私有构造方法,避免外部创建实例      */    
    private LazySingleton(){}    
    /*** 静态工厂方法,返回此类的唯一实例.* 当发现实例没有初始化的时候,才初始化. * @return LazySingleton */    
    synchronized public static LazySingleton getInstance(){
        if(m_intance==null){
           m_intance=new LazySingleton();
         }
         return m_intance;
    }
}

//测试一下单例模式
  LazySingleton lazySingleton = LazySingleton.getInstance();  
  LazySingleton lazySingleton1 = LazySingleton.getInstance();
  
  if(lazySingleton==lazySingleton1)){
   System.out.println(" 同一个对象实例");
  }else{
   System.out.println("不是同一个对象实例");
  }

二、饿汉式单例在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。

/*** 单例模式-饿汉式单例*/
public class EagerSingleton {    
    /**私有的(private)唯一(static final)实例成员,在类加载的时候就创建好了单例对象*/
    private static final EagerSingleton m_instance = new EagerSingleton();
    /*** 私有构造方法,避免外部创建实例      */    
    private EagerSingleton() {}     //提供了一个空的构造方法
    /*** 静态工厂方法,返回此类的唯一实例.* @return EagerSingleton      */    
    public static EagerSingleton getInstance() {
       return m_instance;    
    }
}

//下面来判断一下有没有达到单例效果(系统运行的时候只出来一个空例) 
EagerSingleton eagerSingleton = EagerSingleton.getInstance();  
EagerSingleton eagerSingleton1 = EagerSingleton.getInstance();
  
  if(eagerSingleton==eagerSingleton1)){
   System.out.println(" 同一个对象实例");
  }else{
   System.out.println("不是同一个对象实例");
  }

三、登记式单例这个单例实际上维护的是一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从工厂直接返回,对于 没有登记的,则先登记,而后返回。
/*** 单例模式- 登记式单例*/
public class RegSingleton {    
    /*** 登记薄,用来存放所有登记的实例      */    
    private static Map<String, RegSingleton> m_registry = new HashMap();    
    //在类加载的时候添加一个实例到登记薄    
        static {
           RegSingleton x = new RegSingleton();
           m_registry.put(x.getClass().getName(), x);
        }    
        /*** 受保护的默认构造方法*/    
        protected RegSingleton() {}    
        /*** 静态工厂方法,返回指定登记对象的唯一实例;
             * 对于已登记的直接取出返回,对于还未登记的,先登记,然后取出返回
             * @param name
             * @return
                RegSingleton      */    
public static RegSingleton getInstance(String name) {        
      if (name == null) {            
            name = "RegSingleton";         
       }        
       if (m_registry.get(name) == null) {
            try {
                 m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());
            } catch (InstantiationException e) {                
                  e.printStackTrace();            
            } catch (IllegalAccessException e) {                
                   e.printStackTrace();            
           } catch (ClassNotFoundException e) {                
                   e.printStackTrace();           
            }        
        }        
        return m_registry.get(name);    
}    


/** * 一个示意性的商业方法      * @return String      */    
public String about() {        
      return "Hello,I am RegSingleton!";    
}}

四、单例模式的一个应用该应用是配置文件管理类。为了本例能正确运行,我在C盘下先建立了一个xxxx.properties文件,内容如 下:-------------------

user=rootpassword=leizhimin这个配置文件管理类的代码如下:
单例模式应用-单例类应用-配置文件管理*/
public class ConfigManager {    
/*** 属性文件全名*/    
private static final String PFILE = "C:\\xxx.properties";

分享到:
评论

相关推荐

    c++单例模式线程日志类

    在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在这个特定的场景中,我们讨论的是一个实现了单例模式的日志类,该类专为多线程环境设计,具备日志等级控制、...

    C#创建窗体的单例模式

    在IT行业中,编程模式是一种解决常见问题的最佳实践方式,单例模式是其中之一,它确保一个类只有一个实例,并提供一个全局访问点。在C#中,特别是在开发Windows Forms(WinForm)应用程序时,单例模式可以帮助我们更...

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

    本项目涵盖了四种常见的设计模式:单例模式、工厂模式、动态代理和适配器模式。下面将详细阐述这四种设计模式的概念、作用以及在实际项目中的应用。 **1. 单例模式** 单例模式是一种限制类实例化次数为一个的设计...

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

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

    ava常用设计模式-单例模式

    ava常用设计模式-单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一...

    第五讲单例模式

    单例模式是设计模式中的重要概念,它在软件开发中被广泛应用,特别是在需要全局唯一实例的场景下。在本讲“第五讲单例模式”中,我们将深入探讨这个模式的原理、实现方式以及其在实际编程中的应用。 单例模式的核心...

    浅议单例模式之线程安全(转)

    单例模式是软件设计模式中的一种经典模式,它限制了类的实例化,确保一个类在整个应用程序中只有一个实例。在多线程环境下,线程安全的单例模式尤为重要,因为如果不正确实现,可能会导致多个线程同时创建多个实例,...

    单例模式和CAS(CompareAndSet).md

    玩转单例模式及比较并交换CAS

    乐在其中设计模式(C#)-单例模式(SingletonPattern)[收集].pdf

    《乐在其中设计模式(C#) - 单例模式(Singleton Pattern)》 单例模式是一种常用的设计模式,其核心思想在于确保一个类在整个应用程序的生命周期中只存在一个实例,并提供一个全局访问点来获取这个唯一的实例。在C#中...

    winform序列化 md5加密 单例模式(无视频).rar

    在C#编程中,"winform序列化 md5加密 单例模式(无视频).rar"这个压缩包文件涵盖了一些核心的编程概念和技术,包括Windows Forms(WinForms)应用程序开发、对象序列化、MD5加密以及单例模式。让我们一一探讨这些知识...

    Example-TypeScript-Singleton-Pattern:TypeScript 和单例模式

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在 TypeScript 中,我们可以利用静态属性和私有构造函数来实现单例模式,从而确保类的唯一性。以下是对这个"Example-TypeScript-...

    Android设计模式系列之单例模式

    单例模式是软件设计模式的一种,其主要目的是确保一个类只有一个实例,并且提供一个全局访问点来获取这个实例。在Android系统中,单例模式被广泛应用于管理那些需要全局共享的资源,例如输入法管理者...

    设计模式:创建型之原型(深浅拷贝)、单例(饿汉式与懒汉式),三大工厂模式 结构型之适配器模式,代理模式(三大代理)

    创建型模式关注的是对象的创建过程,包括单例模式、原型模式、工厂模式等。单例模式确保一个类只有一个实例,并提供一个全局访问点;原型模式则是通过复制现有的实例来创建新的实例,适用于创建复杂对象或者避免重复...

    新技术培训 培训讲义9_设计模式之单例适配器和工厂模式.doc

    在这个文档中,我们关注的是三种设计模式:单例模式、适配器模式和工厂模式。 首先,单例模式是一种确保一个类只有一个实例并提供一个全局访问点的设计模式。这种模式的核心在于控制类的实例化过程,确保在任何情况...

    Java之单例模式&&NIO

    Java中的单例模式是一种设计模式,它用于保证一个类只有一个实例,并提供一个全局访问点。在给定的代码示例中,我们看到了两种常见的单例实现方式:懒汉式和饿汉式。 **懒汉式单例模式**: 懒汉式单例的特点是延迟...

    Python单例模式的两种实现方法

    Python中的单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在某些场景下非常有用,比如管理共享资源、配置对象或日志系统等。接下来,我们将详细介绍两种实现Python单例模式的...

    设计模式PPT合集

    单例模式确保一个类只有一个实例,并提供一个全局访问点。在Java中,通常通过私有构造函数和静态工厂方法来实现。单例模式常用于配置中心、线程池等场景,确保系统资源的有效利用。 二、工厂模式 工厂模式是一种...

    python单例模式.zip_图形图像处理_Python_

    在Python中,虽然面向对象的特性使得单例模式的应用不如其他语言那么必要,但在某些场景下,如管理共享资源、全局配置或GUI编程中,单例模式仍然有其价值。 Python GUI编程,即使用Python进行图形用户界面的开发,...

Global site tag (gtag.js) - Google Analytics