Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单身人士通用类_Java_Design Patterns_Singleton_Common Code - Fatal编程技术网

Java 单身人士通用类

Java 单身人士通用类,java,design-patterns,singleton,common-code,Java,Design Patterns,Singleton,Common Code,我目前正在编写一个程序,其中大约有12个类需要是单例的,因为它们使用的是需要不同类型的消息传递服务。我的问题是,不是基本上复制和粘贴每个实例的单例代码来创建一个实例,而只是更改它创建实例的类。对于任何需要创建单例的类,是否有某种方法可以为单例模式使用公共代码 下面是创建其中一个单例的代码 public static void create() { if(instance == null) { instance = new FooDataWriter();

我目前正在编写一个程序,其中大约有12个类需要是单例的,因为它们使用的是需要不同类型的消息传递服务。我的问题是,不是基本上复制和粘贴每个实例的单例代码来创建一个实例,而只是更改它创建实例的类。对于任何需要创建单例的类,是否有某种方法可以为单例模式使用公共代码

下面是创建其中一个单例的代码

public static void create()
{
    if(instance == null)
    {
        instance = new FooDataWriter();
    }
}

您必须复制并粘贴用于实现singleton的任何代码,但根据有效Java(第二版,第18页),实施singleton的最佳方法是使用单元素枚举:

public enum MySingleton {
    INSTANCE;

    // methods
}

如果你这样做,几乎没有什么可以复制和粘贴的

这样的事情是可能的:

public final class Singletons {

    private static final Map<Class<?>, Object> map = new HashMap<>();

    private Singletons() {
    }

    public static <T> T get(Class<T> type) {
        Object instance = map.get(type);
        if (instance != null) {
            return (T) instance;
        }
        synchronized (map) {
            instance = map.get(type);
            if (instance != null) {
                return (T) instance;
            }
            try {
                instance = type.newInstance();
            } catch (Exception e) {
                throw new IllegalArgumentException("error creating instance");
            }
            map.put(type, instance);
            return (T) instance;
        }
    }
}

这也是一个好主意!我只是希望有一种方法可以让单身人士共享一些公共库,如果将来有什么变化,他们不必到处修改代码,但我想没有办法了。@jgr208很遗憾,我认为没有办法。使用枚举的缺点是不能使用
MySingleton extends…
。显然,实现非枚举的单例的最佳方法是:不要生气,但是如果您有12个单例,那么您的设计可能有问题。@HenriqueBarcelos遗憾的是,我们没有,我们使用的是RTI DDS,并且每种消息类型都有自己的类型。就像A是它自己的类型,B是它自己的类型。因此,我们想为每种类型制作一个单独的对象,这样我们就不会在不需要的时候制作一堆对象。如果您可能感兴趣,请查看该模式
FooDataWriter instance = Singletons.get(FooDataWriter.class);