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

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

  • 相关阅读:
    stl学习笔记—set/multimap
    2013 杭州站 hdoj4778 Gems Fight!
    矩阵加速数列递推
    暑假写的两个数据结构
    AC自动机模板 hdoj2222 UVA-11468
    树莓派安装3.5英寸触摸屏幕
    树莓派设置NTP同步
    在树莓派上设置无线静态IP
    运行tomcat7w.exe未安装指定的服务
    LoadRunner 11安装Micosoft Visual C++ 2005 SP1时提示命令行选项语法错误
  • 原文地址:https://www.cnblogs.com/zhuxiansheng/p/8043634.html
Copyright © 2011-2022 走看看