单身的普通类

时间:2015-04-09 13:57:45

标签: java design-patterns singleton common-code

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

以下是创建其中一个单身人士的代码,

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

2 个答案:

答案 0 :(得分:2)

您必须复制并粘贴用于实现单例的任何代码,但根据Effective Java(第2版,第18页),强制执行单例的最佳方法是使用单元素枚举:

public enum MySingleton {
    INSTANCE;

    // methods
}

如果你这样做,几乎没有任何东西可以复制和粘贴!

答案 1 :(得分:0)

这样的事情是可能的:

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

然后你可以做到:

FooDataWriter instance = Singletons.get(FooDataWriter.class);