繁体   English   中英

单例模式示例

[英]example for Singleton pattern

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

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

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

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

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

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

例如, SingletonConfigFile可能看起来像这样。 请记住:

  • 它仅用于读取一个文件。 将此作为配置文件是有意义的。
  • 如果您的类可以被多次实例化,对于不同的文件,则不是单例。
  • 不要使用此代码-它没有考虑到并发问题,这是一个完全不同的讨论领域。

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
   }
}

但是这个例子是有道理的。 单例用于只有一个对象的情况下(如上所述)。 例如,拥有:

  • RingOfPower.getInstance() -只有一个电源环(Sauron的电源环),并且不能再存在。
  • Sun.getInstance() -只有一颗称为“太阳”的星星。
  • 在逻辑上应仅存在一次的应用程序中的所有对象-注册表,应用程序上下文等。

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

放松可能是具有众所周知的系统范围内单个实例的类(除了您可能创建的其他实例之外)。

java.io.File不是Singleton类。

Singleton是一种设计反模式 ,其中为类提供了一个私有构造函数以及一个特殊的“ getInstance()”,“ INSTANCE()”或“ instance()”静态函数,该静态函数负责返回(以及可能构造,取决于您是否使用惰性单例)唯一的对象实例。 单例通常会在隐藏依赖时导致依赖膨胀,并在单元测试期间很难模拟出单例类,或者很难用非单例的东西替换单例,因为事实证明对象应该是单例。实际保持住。

单例反模式的解决方案是使用一种称为“依赖注入”的方法。 您可能会发现标题为Java on Guice的 Google Techtalk,它说明了依赖项注入,很有启发性。

还有另一种形式的单例性,与单例反模式无关...也就是说,如果您碰巧只创建一个类的实例并将其传递,但​​是您不强制执行单例性使用静态构造函数,则可以使类有效地成为单例,而不必将自己锁定在依赖项中,也可以防止以后再使类不单例。 在我所指出的Google Techtalk中,演讲者在演讲结束时提到了这种单例形式。

最好的实时示例是读取仅需要单个实例的属性文件数据。 请找到以下代码来演示示例

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;
    }

}

在Java J2SE API中-两个类CalendarRuntime是Singleton Pattern实时实现的很好示例。

-阿伦

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"); 
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM