单例模式的示例

请给我一个单例模式的实时示例。 访问共享文件的不同线程是单身还是不单独? 由于每个线程访问文件的同一个实例而不是自己的单个实例。

是的,但是只有当所有线程都访问同一个文件,并且您正在使用自定义实现(而不是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’s),并且不存在更多。
  • Sun.getInstance() – 只有一颗星叫做“太阳”。
  • 应用程序的所有对象在逻辑上应该只存在一次 – 注册表,应用程序上下文等。

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

单例模式的一个更常见的例子是配置 – 或记录。 例如, LogManager.getLogManager返回“the” LogManager ,您无法创建新的LogManager 。 同样,您可能有一个可以静态访问的公共配置对象。 (在dependency injection系统中,配置可能不是单例,但是 – 而是为每个组件提供他们需要的配置位,这样他们就不必获取“公共”配置。)

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

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

java.io.File不是Singleton类。

Singleton是一个设计反模式 ,其中一个类被赋予一个私有构造函数和一个特殊的“getInstance()”,“INSTANCE()”或“instance()”静态函数,它负责返回(并且可能构造,取决于你是否使用懒惰的单身人士)唯一的对象实例。 单身人士经常导致依赖性膨胀,同时隐藏依赖关系,并且难以在unit testing期间模拟单例类或者用非单例的东西替换单例,而事实certificate对象应该是单例的假设不是实际上持有。

单例反模式的解决方案是使用称为“dependency injection”的东西。 您可能会发现这个名为Java on Guice的 Google Techtalk,它解释了dependency injection,启发性。

还有另一种forms的单身依赖,它与单身反模式无关……也就是说,如果你碰巧只创建一个类的一个实例并传递它,但是你没有强制执行单一模式使用静态构造函数,然后你已经使一个类有效地单独使用而不将自己锁定到依赖项中或防止类以后不是单例的可能性。 在我所指出的Google Techtalk中,演讲者在演讲结束时提到了这种forms的单身人士。

在Java J2SE API中 – 两个类Calendar和Runtime是Singleton Pattern实时实现的很好例子。

-Arun

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

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