zoukankan      html  css  js  c++  java
  • 设计模式之单例模式

         最近把设计模式看完了,之前已经把UML的内容写了一点,够看类图的水平,现在分别记录下各个设计模式。

      设计模式的定义

        保证一个类仅有一个实例,并提供一个访问它的全局访问点(好吧,我无耻的百度百科了...)

        

        单例模式分为懒汉式和饿汉式,饿汉式这种相对简单,就先来说说这种

        饿汉式单例模式

    public class Singleton {
        private static final Singleton singleton = new Singleton();
        private Singleton() {
            System.out.println("Singleton 初始化");
        }
    
        public static Singleton getInstance() {
            System.out.println("获取实例");
            return singleton;
        }
        public static void main(String[] args) {
            Singleton s = Singleton.getInstance();
            System.out.println(s);
        }
    }

       

    public enum SingletonEnum {
        RED("123", "red"),
        GREEN("456", "green");
    
        @Setter
        @Getter
        private String code;
    
        @Setter
        @Getter
        private String name;
    
        // 构造方法
        private SingletonEnum(String name, String code) {
            System.out.println("初始化" + name + code);
            this.name = name;
            this.code = code;
        }
    
        // 普通方法
        public static String getName(String code) {
            for (SingletonEnum c : SingletonEnum.values()) {
                if (c.getCode().endsWith(code)) {
                    return c.name;
                }
            }
            return null;
        }
    
    
        public static void main(String[] args) {
            System.out.println("开始");
            SingletonEnum red =  SingletonEnum.RED;
            System.out.println(red.getCode());
            System.out.println(red.getName(red.getCode()));
        }
    }

       懒汉式单例模式

    public class Singleton {
        private static  Singleton singleton = null;
        private Singleton() {
            System.out.println("Singleton 初始化");
        }
    
        public static synchronized Singleton getInstance() {
            if (singleton == null) {
                System.out.println("获取实例 第一次");
                singleton = new Singleton();
                return singleton;
            }
    
            System.out.println("获取实例 非第一次");
            return singleton;
        }
        public static void main(String[] args) {
            Singleton s = Singleton.getInstance();
            Singleton s1 = Singleton.getInstance();
            System.out.println(s);
            System.out.println(s1);
            Assert.assertEquals(s,s1);
        }
    }

       当然这里利用了对方法的同步,虽然避免了线程安全的问题,但是牺牲了效率,如果这个类非常常用,那很显然对系统的吞吐影响很大。对应的懒汉式也有几种其余的实现方式

      其一:双重加锁

    public static Singleton getInsantace1() {
            if (singleton == null) {
                synchronized (Singleton.class) {
                    if (singleton == null) {
                        singleton = new Singleton();
                        return singleton;
                    }
                }
            }
            return singleton;
        }

    其中signleton需要用volatile修饰,这种方式很显然,代码的观赏性和可读性还是蛮差的,据说在JDK1.5之前也是有问题的,volatile还有一个重要的作用防止指令重排,对指令重排和volatile关键字感兴趣的可以移步 http://www.infoq.com/cn/articles/java-memory-model-2 和 http://www.infoq.com/cn/articles/java-memory-model-4

      其二:静态内部类

    private static  Singleton singleton = null;
        private Singleton() {
            System.out.println("Singleton 初始化");
        }
    
        public static Singleton getInstance2() {
            return SingletonHodler.singleton;
        }
    
        private static class SingletonHodler {
            private static Singleton singleton = new Singleton();
        }

    单例大概就是这个样子,这里说的不细,全当自己的笔记,推荐研磨设计模式这本书,在设计模式当中还是不错的,当然博客园也有很多大神的博客可以参考。

      参考:研磨设计模式

        
         作者: 重名 
         出处: http://www.cnblogs.com/daily-note 
    
  • 相关阅读:
    UVA 1025 A Spy in the Metro DP水题
    ZOJ 3814 Sawtooth Puzzle BFS
    ZOJ 3816 Generalized Palindromic Number
    UVA 10859 Placing Lampposts 树形DP
    UVA 11825 Hackers' Crackdown 状压DP
    POJ 2887 Big String 线段树 离线处理
    POJ 1635 Subway tree systems Hash法判断有根树是否同构
    BZOJ 3110 k大数查询 & 树套树
    sdoi 2009 & 状态压缩
    来自于2016.2.24的flag
  • 原文地址:https://www.cnblogs.com/daily-note/p/5496361.html
Copyright © 2011-2022 走看看