zoukankan      html  css  js  c++  java
  • java 之 单例模式(大话设计模式)

    笔者记得去面试时曾被问起这个模式,当时还没有看过设计模式,对设计模式基本上一无所知,不过可以肯定的是笔者用过单例模式。当时回答的风马牛不相及,很尴尬。

    也是从那时起,开始学习设计模式。今天所说的就是单例模式,有很多时候,我们希望类只能实例化一次。例如我们经常使用的Method等就是最典型的单例模式。当然很多框架中也是有单例模式。

    先看下类图:

    大话设计模式-类图

    单例模式分为懒汉式和饿汉式。先看下笔者的demo。

    /**
     * 饿汉式
     */
    public class SingleDemo {
    
        private static SingleDemo singleDemo = new SingleDemo();
    
        private SingleDemo() {
    
        }
    
        public static SingleDemo getInstance() {
            return singleDemo;
        }
    }
    /**
     * 懒汉式
     */
    public class SingleDemo2 {
    
        private static SingleDemo2 singleDemo2 = null;
    
        private SingleDemo2() {
    
        }
    
        public static SingleDemo2 getInstance() {
            if (null == singleDemo2) {
                synchronized (SingleDemo2.class) {
                    if (null == singleDemo2) {
                        return singleDemo2 = new SingleDemo2();
                    }
                }
            }
            return singleDemo2;
        }
    }
    /**
     * 内部类 懒汉式
     */
    public class SingleDemo3 {
    
        private SingleDemo3() {
    
        }
    
        private static class SingleHold {
            private static SingleDemo3 singleDemo3 = new SingleDemo3();
        }
    
        public static SingleDemo3 getInstance() {
            return SingleHold.singleDemo3;
        }
    }
    /**
     * 客户端
     */
    public class Test {
    
        public static void main(String[] args) {
    
            SingleDemo singleDemo = SingleDemo.getInstance();
            SingleDemo singleDemo1 = SingleDemo.getInstance();
            System.out.println(singleDemo == singleDemo1);
    
            SingleDemo2 singleDemo2 = SingleDemo2.getInstance();
            SingleDemo2 singleDemo21 = SingleDemo2.getInstance();
            System.out.println(singleDemo2 == singleDemo21);
    
            SingleDemo3 singleDemo3 = SingleDemo3.getInstance();
            SingleDemo3 singleDemo31 = SingleDemo3.getInstance();
            System.out.println(singleDemo3 == singleDemo31);
        }
    }

    运行结果:

    true
    true
    true

    这三者笔者推荐大家使用内部类形式,三者的区别网上很多,笔者偷下懒给大家一个地址:http://www.cnblogs.com/coffee/archive/2011/12/05/inside-java-singleton.html

    以上,希望能帮助学习单例模式的小伙伴。

  • 相关阅读:
    ES6变量的解构赋值
    ES6新增内容
    Rvalue references
    range-based for statement
    Space in Template Expression, nullptr, and auto
    Type Alias、noexcept、override、final
    Variadic Template
    =default =delete
    为什么不要特化函数模版?
    boost::noncopyable 的作用
  • 原文地址:https://www.cnblogs.com/zhuxiansheng/p/8043634.html
Copyright © 2011-2022 走看看