设计模式之Singleton模式

Singleton模式:
又称单态模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点(getInstance())。
在很多操作中,比如建立目录,数据库连接,访问计数器等都需要这样的单线程操作。

方法一:
定义一个类,它的构造函数为private的,所有方法为static的,因此无法得到该类的实例,只能通过访问静态成员的方式来使用

public class Singleton {
    private Singleton(){} //将构造函数声明为私有,阻止一切试图将该类实例化的行为

  private static int a,b; //私有全局变量,只供内部调用

    public static int Compute()  //静态方法,供外部访问

    return (a+b);   
   }
}

外部调用Singleton.getInstance(),得到一个Singleton实例,且只能得到这个实例,以后再次调用Singleton.getInstance()仍得到的是这个实例。


方法二:
定义一个类,它的构造函数为private的,它有一个static的private的该类的实例变量,在类初始化时实例化,通过一个public的getInstance方法获取对它的引用,继而让外部调用该方法:

public class Singleton {
    private Singleton(){}//将构造函数声明为私有,阻止一切试图将该类实例化的行为,只允许通过类调用(类静态方法调用)来得到实例

  private static Singleton instance = null;

  public static synchronized Singleton getInstance()  //使用同步修饰方法,每时刻只能有一个线程使用该方法。
{

  if (instance==null)
    instance=new Singleton();
  return instance;   }

}

该定义方法在类装载时就生成一个该类的实例,且日后无论何时调用该类中的getInstance(),得到的仍是那个静态的instance,从而保证该类只有这么一个实例(即返回的static instance)


方法三:
用全局(静态)标志位来保证只有一个实例被生成。

public class Singleton {
    static boolean instance_flag = false; //定义全局标志位,用于检测是否有实例生成,为true则有,为flase则无

    public singleton() throws SingletonException   //构造函数

{      if(instance_flag)
           throw SingletonException("only one instance is allowed!");  //如果有实例,则抛出异常
       else
           instance_flag = true;     
           System.out.println("instance created!");
}
    public void finalize()        
{

    instance_flag = false; //实例被GC清除时将标志位复位。

}

                       }


前两种方法都不通过构造函数生成实例
第一种方法不能产生类的实例,只能通过静态访问来使用该类。
第二种方法通过调用一个静态的getInstance()方法来得到类的实例,该实例在类被装载时就已静态生成。
第三种方法通过设置一个全局标志来控制实例的生成次数,在调用构造函数时就判断是否已有实例存在,如有则抛出异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值