java 单例模式

单例模式特征
 
  • 私有的构造方法;

  • 指向自己实例的私有静态引用;

  • 以自己实例为返回值的静态的公有方法

package com.sheji;
/**
 * 饿汉模式
 * @author YangTG
 * 类的构造定义为私有的private。保证其他类不能实例化此类。然后提供一个静态的实例返回给调用者使用。
 * 饿汉模式是最简单的设计模式。在类加载的时候就已经实例进行创建了,这个实例在整个程序周期都是存在的。
 * 好处是在加载的时候就被创建了。只需要创建一次就可以了。
 * 缺点就是,不需要使用的时候也会创建。而且在类加载的时候就被创建。一直存在内存中。会造成浪费
 * 
 */
public class Singleton1 {
   private static Singleton1 sing = new Singleton1();
   
   private Singleton1(){
	   
   }
   
   public static Singleton1 newInstance(){
	   
	   return sing;
   }
}
  • 立即加载 : 在类加载初始化的时候就主动创建实例;

  • 延迟加载 : 等到真正使用的时候才去创建实例,不用时不去主动创建

 

package com.sheji;
/**
 * 懒汉模式
 * @author YangTG
 *  单利中的懒汉模式。在需要的时候才去创建。如果单列已经创建,则再次调用就返回上次创建的对象,不会创建对象。
 *  如果某个单列使用的次数少,而且创建时候很消耗资源。懒汉模式就很适用
 */
public class Singleton2 {
     private static volatile Singleton2 sing = null;
     private Singleton2(){
    	 
     }
     
     public static Singleton2 newInstance(){
    	 if(null==sing){
    		 sing = new Singleton2();
    	 }
    	 return sing;
     }
     
     //看似很完美,但是如果多个线程情况下的话,还是会创建多个实例。这个时候就需要加锁
     
     public static synchronized Singleton2 getnewInstance(){
    	 if(null==sing){
    		 sing = new Singleton2();
    	 }
    	 return sing;
     }
     
     //枷锁后解决了多线程创建多个实例问你,但是synchronized修饰后会很慢使用双重校验.属性加volatile
     public static Singleton2 getnewInstance1(){
    	 if(sing==null){
    		 synchronized(Singleton2.class){
    			 if(null==sing){
    				 sing = new Singleton2();
    			 }
    		 }
    	 }
    	 return sing;
     }
}

 

package com.sheji;

/**
 * 使用静态内部类实现单利模式
 * @author YangTG
 *
 */
public class Singleton3 {
    private static class SingletonHolder{
    	public static Singleton3 sing = new Singleton3();
    }
    private Singleton3(){
    	
    }
    public static Singleton3 getNewInstance(){
    	return SingletonHolder.sing;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值