请给我一个单身模式的实时示例。 访问共享文件的不同线程是单身还是不单独?由于每个线程访问文件的同一个实例而不是自己的单个实例。
答案 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)
答案 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");
}
}