Java 单例模式示例

Java 单例模式示例,java,oop,Java,Oop,请给我一个单例模式的实时示例。 访问共享文件的不同线程是否为单线程?因为每个线程都访问文件的同一个实例,而不是它们自己的单个实例。是的,但前提是所有线程都访问同一个文件,并且您使用的是自定义实现(不是java.io.file,可能是包装器) singleton模式是一种设计模式,用于将类的实例化限制为一个对象 单例(通常是一个错误的选择)是在整个程序中只能有一个实例的类 例如,SingletonConfigFile可能如下所示。记住: 它只用于读取一个文件。这将是一个配置文件 如果您的类可以针

请给我一个单例模式的实时示例。
访问共享文件的不同线程是否为单线程?因为每个线程都访问文件的同一个实例,而不是它们自己的单个实例。

是的,但前提是所有线程都访问同一个文件,并且您使用的是自定义实现(不是
java.io.file
,可能是包装器)

singleton模式是一种设计模式,用于将类的实例化限制为一个对象

单例(通常是一个错误的选择)是在整个程序中只能有一个实例的类

例如,
SingletonConfigFile
可能如下所示。记住:

  • 它只用于读取一个文件。这将是一个配置文件
  • 如果您的类可以针对不同的文件多次实例化,那么它就不是单例的
  • 不要使用这段代码——它没有考虑到并发问题,这是一个完全不同的讨论领域

但这个例子是站在理性的边缘。在只有一个对象的情况下使用单例(如上所述)。例如,有必要:

  • RingOfPower.getInstance()
    -只有一个能量环(索伦的),再多也没有了
  • Sun.getInstance()
    -只有一颗星叫做“Sun”
  • 应用程序中逻辑上只应存在一次的所有对象—注册表、应用程序上下文等

是,但前提是所有线程都访问同一个文件,并且您使用的是自定义实现(不是
java.io.file
,可能是包装器)

singleton模式是一种设计模式,用于将类的实例化限制为一个对象

单例(通常是一个错误的选择)是在整个程序中只能有一个实例的类

例如,
SingletonConfigFile
可能如下所示。记住:

  • 它只用于读取一个文件。这将是一个配置文件
  • 如果您的类可以针对不同的文件多次实例化,那么它就不是单例的
  • 不要使用这段代码——它没有考虑到并发问题,这是一个完全不同的讨论领域

但这个例子是站在理性的边缘。在只有一个对象的情况下使用单例(如上所述)。例如,有必要:

  • RingOfPower.getInstance()
    -只有一个能量环(索伦的),再多也没有了
  • Sun.getInstance()
    -只有一颗星叫做“Sun”
  • 应用程序中逻辑上只应存在一次的所有对象—注册表、应用程序上下文等
    • 一个“文件”不是一个Java对象(而且
      Java.io.file
      肯定不是一个单一对象)。我也不会认为磁盘上的文件是一个单独的文件,它们只是共享资源。特别是,磁盘上并不是只有一个文件:)

      单例模式的一个更常见的例子是配置或日志记录。例如,
      LogManager.getLogManager
      返回“the”
      LogManager
      ,您不能创建新的。同样,您可能有一个可以静态访问的公共配置对象。(在依赖注入系统中,配置很可能不是单例,但是-相反,每个组件都提供了它们所需的配置位,这样它们就不必获取“公共”配置。)

      一个“文件”不是一个Java对象(而且
      Java.io.file
      肯定不是单例)。我也不会认为磁盘上的文件是一个单独的文件,它们只是共享资源。特别是,磁盘上并不是只有一个文件:)


      单例模式的一个更常见的例子是配置或日志记录。例如,
      LogManager.getLogManager
      返回“the”
      LogManager
      ,您不能创建新的。同样,您可能有一个可以静态访问的公共配置对象。(在依赖注入系统中,配置很可能不是单一的,但是-相反,每个组件都提供了它们所需的配置位,这样它们就不必获取“公共”配置位。)

      单一的通常意味着拥有一个只存在一个实例的类

      松弛可能是一个具有著名的系统范围的单个实例的类(除了您可能创建的其他实例之外)


      java.io.File
      不是单例类。

      单例通常意味着拥有一个只能存在一个实例的类

      松弛可能是一个具有著名的系统范围的单个实例的类(除了您可能创建的其他实例之外)

      java.io.File
      不是一个单例类。

      单例是一种设计反模式,在这种模式中,类被赋予一个私有构造函数和一个特殊的“getInstance()”、“INSTANCE()”或“INSTANCE()”静态函数,该函数负责返回(以及可能的构造,具体取决于是否使用惰性单例)唯一的对象实例。在隐藏依赖项时,单例通常会导致依赖项膨胀,并使得在单元测试期间很难模拟单例类,或者用非单例的东西替换单例,而事实证明,对象应该是单例的假设实际上并不成立

      单例反模式的解决方案是使用所谓的“依赖注入”。您可能会发现这篇名为“谷歌Techtalk”的文章很有启发性,它解释了依赖注入

      还有另一种形式的单例性,它与单例反模式无关。。。也就是说,如果您碰巧只创建了一个类的实例并将其传递给其他人,但是您没有强制si
      public SingletonConfigFile {
         private static String filename = "config.xml";
         private File file;
         private static SingletonConfigFile instance;
      
         private SingletonConfigFile() {
             if (instance != null) {
                 throw new Error();
             }
             file = new File(filename);
         }
      
         public synchronized SingletonConfigFile getInstance() {
            if (instance == null) {
                instance = new SignletonConfigFile();
            }
            return instance
         }
      
         public String read() {
             // delegate to the underlying java.io.File
         }
      }
      
      public class SingleTonDesignPattern {
          public static SingleTonDesignPattern singleTon = null;
          public Properties priperty = null;
      
          private SingleTonDesignPattern() {
      
          }
      
          public static SingleTonDesignPattern getSingleTon() {
              return singleTon;
          }
      
          public Properties getPriperty() {
              return priperty;
          }
      
          public void setPriperty(Properties priperty) {
              this.priperty = priperty;
          }
      
          public static synchronized SingleTonDesignPattern getSingleTonObject() {
              if(singleTon == null) {
                  singleTon = new SingleTonDesignPattern();
                  Properties properties1 = new Properties();
                  try {
                      properties1.load(new FileInputStream("c:/labels.properties"));
                      singleTon.setPriperty(properties1);
                  } catch (FileNotFoundException ex) {
                      ex.printStackTrace();
                  } catch (IOException ioe) {
                      ioe.printStackTrace();
                  }
              }
              return singleTon;
          }
      
      }
      
      public class Singleton {
      
         private static Singleton singleton = new Singleton( );
      
         /* A private Constructor prevents any other 
          * class from instantiating.
          */
         private Singleton(){ }
      
         /* Static 'instance' method */
         public static Singleton getInstance( ) {
            return singleton;
         }
         /* Other methods protected by singleton-ness */
         protected static void demoMethod( ) {
            System.out.println("demoMethod for singleton"); 
         }
      }