数据结构和算法分析大数据计算机杂谈

设计模式笔记(5)

2018-05-29  本文已影响0人  球球球球笨

单例模式

实例化一个对象这件事情都是类本身来完成的,不应该听从于外部程序。

public class Wife {
    private static Wife wife;
    
    private wife() {
        ...
    }
    public static Wife GetInstance()
    {
        if(wife == null) wife = new Wife();
        return wife;
    }
    public void show(){}
    public void marry() {}
}

GOF对单例模式的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

客户端代码如下:

public static void main(String[] args)
{
     Singleton singletonA = Singletion.GetInstance();
     Singleton singletonB = Singletion.GetInstance();
     if(singletonA == singletonB)
     {
         same
     }
}

"=="对于值类型会判断其值是否相等,对于引用类型会判断引用(内存地址)是否相同,也就是判断是否是同一个对象

线程安全性

引入锁的概念。Lock类,作用为构造一块临界区来控制线程对于代码的访问,确保每次只有一个线程运行到临界区的代码,其他的线程运行到临界区时,将会一直等待直到前面的线程运行出临界区为止。

加锁后的wife类

public class Wife {
    static Lock lock = new ReentranLock();
    private static Wife wife;
    
    private wife() {
        ...
    }
    public static Wife GetInstance()
    {
        lock.lock();
        if(wife == null) wife = new Wife();
        lock.unlock();
        return wife;
    }
    public void show(){}
    public void marry(){}
}

改良后

public static Wife GetInstance()
{
    if(wife == null) {
        lock.lock();
        wife = new Wife();
        lock.unlock();
    }//缩小了临界区
    return wife;
}

再改良

public static Wife GetInstance()
{
    if( wife == null ) {
        lock.lock();
        if( wife == null ) {
            wife = new Wife();
        }
        lock.unlock();
    }//缩小了临界区
    return wife;
}

以下情况适用于单例模式

  1. 当类只能有一个实例且第三方可以从一个公共的访问点访问它时
  2. 当一个唯一的实例可以通过子类化来拓展,而且第三方需要在不更改代码的情况下就能使用一个拓展的实例时。
上一篇下一篇

猜你喜欢

热点阅读