[英]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;
}
}
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.