`
wlh269
  • 浏览: 455735 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对比3种单例模式

 
阅读更多
单例模式的优点

  1,实例控制:单例模式防止其它对象对自己的实例化,确保所有的对象都访问一个实例。
  2,伸缩性:因为由类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
单例模式的缺点

   1,系统开销。虽然这个系统开销看起来很小,但是每次引用这个类实例的时候都要进行实例是否存在的检查。这个问题可以通过静态实例来解决。
   2,开发混淆。当使用一个单例模式的对象的时候(特别是定义在类库中的),开发人员必须要记住不能使用new关键字来实例化对象。因为开发者看不到在类库中的源代码,所以当他们发现不能实例化一个类的时候会很惊讶。

实现原则:
a.私有的静态的实例
b.私有的构造方法
c.公有静态的访问接口


第一种方法:饿汉式单例类

//========外部直接调用 DaoFactory.getInstance();静态方法即可得到当前类的实例

public class DaoFactory {
          //私有的静态的实例
	private static DaoFactory instance = new DaoFactory();
	//私有的构造方法
	private DaoFactory() {}
	//公有静态的访问接口,返回当前类的实例
	public static DaoFactory getInstance() {
		return instance;
	}
	
	}


//客户端访问
public class SingletonTest {

	
	public static void main(String []args){
		
		DaoFactory factory1=DaoFactory.getInstance();
		DaoFactory factory2=DaoFactory.getInstance();
		//判断得到的2个实例是是否相等
		if(factory1==factory2){
			System.out.print("属于同一个实例");
		}
		
	}
}

 



第二种方法:懒汉式单例类,可以同步但是效率不高:

public class Singleton { 
	
	private static Singleton instance = null; 
	public static synchronized Singleton getInstance() { 
        if(instance==null){
      
      	 instance=new Singleton();
        }
	return instance;
	
	}
   public static void main(String []args){
 
   Singleton s=Singleton.getInstance();
   Singleton s2=Singleton.getInstance();
   if(s==s2){
	   System.out.print("s==s2");
   }
}
} 




第三种,双检锁写法:
上面的第二种写法,程序不会出错,因为整个getInstance是一个整体的"critical section",但就是效率很不好,因为我们的目的其实只是在第一个初始化instance的时候需要locking(加锁),而后面取用instance的时候,根本不需要线程同步。
于是聪明的人们想出了下面的做法:
 public class Singleton{    
  private static Singleton single; //声明静态的单例对象的变量    
  private Singleton(){}    //私有构造方法    
      
  public static Singleton getSingle(){ //外部通过此方法可以获取对象      
    if(single == null){       
        synchronized (Singleton.class) { //保证了同一时间只能只能有一个对象访问此同步块          
            if(single == null){        
                 single = new Singleton();            
         }       
       }    
     }      
    return single; //返回创建好的对象    
   }    
}  
分享到:
评论

相关推荐

    Java设计模式之单例模式

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

    单例模式分享-吴昌良

    3. **单例模式的优缺点**:讨论单例模式的优点与潜在的问题。 #### 七、总结 通过以上内容的学习,我们可以看到单例模式是一种非常实用的设计模式,尤其适用于需要确保全局唯一实例的场景。掌握单例模式不仅可以...

    浅谈Spring单例Bean与单例模式的区别

    本文主要介绍了Spring单例Bean与单例模式的区别,通过对比两者的定义、实现机制和应用场景,帮助读者更好地理解这两种概念的异同。 一、单例模式的定义和实现 单例模式是一种创建型设计模式,它的主要特点是确保在...

    PHP 单例模式解析和实战

    以下是一个简单的数据库访问例子,对比普通的方法和使用单例模式的方法: ##### 1、普通的数据库访问例子 ```php // 初始化一个数据库句柄 $db = new DB(); // 添加用户信息 $db->addUserInfo(); // 在函数中...

    浅谈C#单例模式的实现和性能对比

    单例指的是只能存在一个实例的类(在C#中,更准确的说法是在每个AppDomain之中只能存在一个实例的类,它是软件工程中使用最多的几种模式之一。在第一个使用者创建了这个类的实例之后,其后需要使用这个类的就只能...

    Java线程安全中的单例模式

    在Java编程中,单例模式是一种常用的创建型设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。在多线程环境下,线程安全的单例模式尤为重要,因为不正确的实现可能导致多个实例的创建,这将破坏设计...

    软件设计模式实验报告.doc

    通过对比两个实例的相等性验证了单例模式的实现。实验结果显示,两个实例代表的是同一个对象,证实了单例模式的有效性。 然而,单例模式也存在局限性,如缺乏抽象层,导致类扩展困难,不便于进行多态操作,可能限制...

    java之23种设计模式完整代码

    - **单例模式**:确保一个类只有一个实例,并提供全局访问点。 - **工厂方法模式**:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 - **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口...

    01-02-07-各设计模式总结与对比1

    比如,工厂模式和单例模式常常结合使用,单例模式通常用于实现工厂类以保证全局唯一性。策略模式和工厂模式虽然都涉及对象的创建,但策略模式更关注的是行为的选择和替换。模板方法模式和工厂方法模式在结构上有相似...

    计算机后端-Java-Java核心基础-第15章 面向对象07 18. 单例模式的使用场景.avi

    计算机后端-Java-Java核心基础-第15章 面向对象07 17. 饿汉式和懒汉式的对比.avi

    HeadFirst设计模式PPT

    创建型模式关注对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)和建造者模式(Builder)。单例模式确保一个类只有一个实例,并提供全局访问点;工厂方法模式将对象的创建过程抽象化,允许子类...

    Java与模式 (清晰书签版) 创建模式、 行为模式、 结构模式 模式 清晰3

    创建模式主要关注对象的创建过程,包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。单例模式确保一个类只有一个实例,并提供全局访问点;工厂方法模式定义一个用于创建对象的接口,但让子类决定...

    设计模式——刘伟

    1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。单例模式常用于控制资源的共享,如数据库连接、线程池等。实现方式有懒汉式(线程不安全)、饿汉式(线程安全)以及双重检查锁定等。 2. **工厂...

    java 中单例模式饿汉式与懒汉式的对比

    单例模式有两种实现方式:饿汉式和懒汉式。饿汉式单例模式是在类加载到内存时,就已经在内存中创建了一个实例对象,这样就会占用内存资源。例如: public class Test { private static Test instance = new Test()...

    各设计模式总结与对比.rar

    - 单例模式:保证一个类只有一个实例,并提供全局访问点。 - 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 - 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而无需指定...

    设计模式手册

    创建型模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory Method)和建造者模式(Builder)。结构型模式关注如何组合现有组件以形成更复杂结构,如适配器模式(Adapter)、装饰器模式(Decorator...

    设计模式练习,很有感触

    Java中的单例模式是一种确保一个类只有一个实例并提供全局访问点的模式。在描述中提到的练习中,可能包括对单例模式的实现和其在不同场景下的应用分析。例如,饿汉式(立即初始化)和懒汉式(延迟初始化)的实现方式...

    c#设计模式`很好的书啊

    在创建型模式中,单例模式确保一个类只有一个实例,而工厂模式则提供了一种创建对象的最佳方式,避免了直接new操作,增加了代码的灵活性。抽象工厂模式则允许在运行时创建一系列相关的或相互依赖的对象,无需指定...

Global site tag (gtag.js) - Google Analytics