JavaRush /Java 博客 /Random-ZH /用你自己的话来说单例模式
Roman_kh
第 33 级
Харьков

用你自己的话来说单例模式

已在 Random-ZH 群组中发布

大家好,javaRush!

今天给大家讲一下设计模式Singleton(单)。 用你自己的话来说单例模式 - 1目标:创建一个只有一个对象的类。这意味着无论访问多少次,都会返回第一次创建的同一个对象。这是一件很方便的事情,在很多地方都是必要的,它被实现到框架中并不是没有原因的。 应用:
  • 例如,您需要将数据库连接到项目以及负责连接到该项目的类。连接创建一次,无需多次创建
  • Application settings— 负责应用程序所需的连接设置的类:数据库主机和端口等。它们创建一次并在应用程序的整个操作过程中使用。
  • 还有很多我没有提到的例子,所以请在评论中写下你的选择!=)
在这个介绍之后,据我了解,我们可以展示这个类的一个例子:(尽管我相信我们每个人都可以想出这个类的实现)这是最简单的例子,当我们将构造函数设为私有时,即 您无法显式创建对象。并且有一个getInstance()提供对象的静态方法。
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
多线程有问题,那么可以放一个getInstance()标记方法synchronized
public class Singleton {
  private static Singleton instance;
  private Singleton () {}

  public static synchronized Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
最后,像往常一样,我想说,如果你有不同的想法或者发现我的错误,请写在评论中!我们将愉快地讨论一切:)如果您喜欢这篇文章,请写“+”,我会知道的。这对我来说很重要:) PS 我正在添加更多实现:根据Joshua Bloch 的说法,这是实现模板的最佳方式Enum Singleton
public enum Singleton {
   INSTANCE;
}
Double Checked Locking & volatile
public class Singleton {
        private static volatile Singleton instance;

        public static Singleton getInstance() {
      Singleton localInstance = instance;
      if (localInstance == null) {
         synchronized (Singleton.class) {
            localInstance = instance;
            if (localInstance == null) {
               instance = localInstance = new Singleton();
            }
         }
      }
      return localInstance;
   }
}
并进一步On Demand Holder idiom
public class Singleton {

   public static class SingletonHolder {
      public static final Singleton HOLDER_INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
      return SingletonHolder.HOLDER_INSTANCE;
   }
}
+延迟初始化 +高性能 -不能用于非静态类字段 任何问题/建议 - 写在评论中! 另请参阅我的其他文章:
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION