有一个独立的Java应用程序。在其中有一个工厂方法,它被调用一次并只创建一个对象(如果可以创建它)。我有两个问题 - 哪种模式对此更好?其次,在这种情况下,在工厂中存储创建工厂的对象是正确的吗?
答案 0 :(得分:3)
设计模式为Singleton。将样品存储在工厂中是正确的,就像样品一样。使用单例时,如果属性为null,则检查该属性。如果属性为null,则创建新对象。
答案 1 :(得分:2)
在Java中创建单个对象的最常见模式是Singleton Pattern。根据记录模式的Design Patterns: Elements of Reusable Object-Oriented Software,Singleton模式的目的如下:
确保一个类只有一个实例,并提供一个全局点 访问它
创建单例对象有两种方法:热切而懒惰。渴望实例化很简单,因为它相当于创建一个对象并通过getter返回它:
public EagerSingleton {
private static final EagerSingleton INSTANCE = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return INSTANCE;
}
}
如果对象的创建很昂贵(因此应尽可能延迟)或者如果有可能永远不需要对象,那么懒惰地实例化单例可能是个好主意。这是一个看似困难的任务,因为多个线程可以访问延迟实例化的对象,并且实现必须确保只创建一个对象,而不管对象访问的并发数量(即,如果两个线程都看到单例没有已创建,只应创建一个对象,而不是两个,并由两个线程使用。)
实现懒惰单例的安全方法如下:
public class Singleton {
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
这可确保在调用getInstance
之前不会创建嵌套的静态对象。这种方案有许多优化,但除非严格要求性能,否则应使用上述方案。这种模式的自定义实现很难确保安全。
答案 2 :(得分:1)
工厂似乎适应了您的要求
请注意,如果要掌握创建的对象的实例数,一种简单的方法是通过定义私有构造函数和创建对象的静态方法来定义要作为工厂类本身创建的实例的类。方式。
请注意,这种方式可能会在实现与其客户端之间建立强大的耦合。因此,您可以使用耦合度较低的解决方案,例如依赖注入或使用接口实现。
答案 3 :(得分:1)
当您只想创建一个对象并且可以在整个应用程序中使用时,使用Singleton设计模式会更好。如果您使用工厂设计模式仅创建一个对象并在整个应用程序中使用,那么您可以使用Singleton模式。
为了创建工厂对象的工厂,请使用Abstract Factory设计模式。 我编写了60个Java / J2EE设计模式。