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 
    
  • 相关阅读:
    WebApi集成Grpc客户端
    【Oracle】AWR报告生成
    ora-7445 导致 ora-600 ,oracle数据库 11gR2崩溃
    .NET的并发编程(TPL编程)是什么?
    打算写一些Netty的文章了,先聊聊为什么要学习Netty
    2020实战复盘:如何从0到1搭建数据传输平台产品DTS?
    DevOps,CI,CD,自动化简单介绍
    【python刷题】二叉树递归-非递归遍历-序列-反序列化
    python正则表达式-匹配用符号分割的多个字符串
    用 Flutter 搭建标签+导航框架
  • 原文地址:https://www.cnblogs.com/daily-note/p/5496361.html
Copyright © 2011-2022 走看看