设计模式笔记(5)

作者: 球球球球笨 | 来源:发表于2018-05-29 21:19 被阅读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. 当一个唯一的实例可以通过子类化来拓展,而且第三方需要在不更改代码的情况下就能使用一个拓展的实例时。

    相关文章

      网友评论

        本文标题:设计模式笔记(5)

        本文链接:https://www.haomeiwen.com/subject/mkczjftx.html