单例模式的示例

时间:2010-03-19 06:26:19

标签: java oop

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

7 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

java.io.File不是Singleton类。

答案 3 :(得分:1)

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

单例反模式的解决方案是使用称为“依赖注入”的东西。您可以找到名为Java on Guice的Google Techtalk,它解释了依赖注入,启发。

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

答案 4 :(得分:0)

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

-Arun

答案 5 :(得分:0)

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

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

}

答案 6 :(得分:0)

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