• 初探设计模式----单例模式


    单例模式是我们经常使用的一种设计模式,那么让我们自己来设计一种单例模式的话,我们该如何设计呢??

    设计的方式有很多种,我们依次来看一下:

    首先是第一种:

     1 /**
     2  * 简单的方式:在并发执行的时候可能存在多个实例
     3  *
     4  * @author cuibin
     5  * @create 2017-08-30 20:38
     6  **/
     7 public class Singleton1 {
     8 
     9     private static Singleton1 INSTANCE;
    10 
    11     private Singleton1(){}
    12 
    13     public static Singleton1 getInstance(){
    14         if(INSTANCE == null){
    15             INSTANCE = new Singleton1();
    16         }
    17         return INSTANCE;
    18     }
    19 }

    第一种思路是比较简单的,通过判断来确定是否创建实例,但是有个致命的问题,在高并发时,当两个或几个请求同时到达时,还是会创建多个实例,怎么解决呢,我们来看第二种:

     1 **
     2  * 公共域方式 简单
     3  * @author cuibin
     4  * @create 2017-08-30 20:47
     5  **/
     6 public class Singleton2 {
     7 
     8     public static final Singleton2 INSTANCE = new Singleton2();
     9 
    10     private Singleton2(){};
    11 
    12 }

    第二种采用公共域的方式,有效的解决了并发状态下多个实例的问题,但是,问题又出现了,我们不能够在实例中添加逻辑,gg了,我们来看第三种:

     1 /**
     2  * 工厂化方式,可以在实例过程中添加逻辑
     3  *
     4  * @author cuibin
     5  * @create 2017-08-30 20:49
     6  **/
     7 public class Singleton3 {
     8 
     9     private static final Singleton3 INSTANCE = new Singleton3();
    10 
    11 
    12     private Singleton3(){}
    13 
    14     public static Singleton3 getInstance(){
    15         return INSTANCE;
    16     }
    17 }

    第三种看起来非常完美了,但它还不是最好的,我们来看最好的写法:

     1 /**
     2  * 枚举类方式 最佳实践
     3  */
     4 public enum Singleton4 {
     5 
     6     INSTANCE;
     7 
     8     public static void say(String str){
     9         System.out.println("hello " + str);
    10     }
    11 }

    通过枚举类的方式,最佳实践。接下来我们来测试一下,看是否能真正实现单例:

     1 /**
     2  * @author cuibin
     3  * @create 2017-08-30 20:54
     4  **/
     5 public class TestSingleton {
     6 
     7     public static void main(String[] args) {
     8 
     9         System.out.println("Singleton1" + Singleton1.getInstance());
    10         System.out.println("Singleton1" + Singleton1.getInstance());
    11 
    12         System.out.println("Singleton2" + Singleton2.INSTANCE);
    13         System.out.println("Singleton2" + Singleton2.INSTANCE);
    14 
    15         System.out.println("Singleton3" + Singleton3.getInstance());
    16         System.out.println("Singleton3" + Singleton3.getInstance());
    17 
    18         System.out.println("Singleton4" + Singleton4.INSTANCE);
    19         System.out.println("Singleton4" + Singleton4.INSTANCE);
    20         Singleton4.INSTANCE.say("cuibin");
    21     }
    22 }

    我们来看控制台输出:

    以上就是设计单例的四种方式。

  • 相关阅读:
    佛教哲学 学习笔记 01-我愿为十方人做桥
    动手学python之python基础:标识符,注释及缩进
    动手学python系列序言
    基于深度学习的目标检测综述(一):简介及骨干网络
    软件项目风险管理
    axure
    软件项目管理
    软件测试方法
    期中总结
    UML图相关
  • 原文地址:https://www.cnblogs.com/cuibin/p/7455327.html
Copyright © 2020-2023  润新知