2015-04-09 5 views
0

В настоящее время я пишу программу, в которой около 12 классов должны быть одноэлементными, из-за чего они используют службу обмена сообщениями, которая нуждается в разных типах. Мой вопрос заключается в том, что вместо того, чтобы в основном копировать и вставлять один сингл код для каждого для создания экземпляра, только с изменением класса он делает экземпляр. Есть ли какой-нибудь общий код, который используется для шаблона singleton, для любого класса, который должен создать singleton?Обычный класс для singleton

Вот код, чтобы создать одну из одиночек,

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

Не обижайтесь, но если у вас есть 12 одиночек, вы, вероятно, делать что-то не так с ваш дизайн. –

+0

@HenriqueBarcelos, к сожалению, мы не имеем, мы используем RTI DDS, и каждый тип сообщения имеет свой собственный тип. Так как A - это собственный тип, а B - его собственный тип. Поэтому мы хотим сделать singleton каждого типа, поэтому у нас нет кучи объектов, созданных, когда они не нужны. – jgr208

+0

Ну, я не согласен. Если вам может быть интересно, посмотрите на шаблон [Flyweight] (http://en.wikipedia.org/wiki/Flyweight_pattern) –

ответ

2

Вы должны скопировать и вставить любой код, который вы используете для реализации одиночки, но в соответствии с Effective Java (2-е издание, стр.18) лучший способ обеспечить синглтона является использование одного элемента перечисления на:

public enum MySingleton { 
    INSTANCE; 

    // methods 
} 

Если вы делаете это таким образом, что нет почти ничего, чтобы скопировать и вставить!

+0

Это тоже хорошая идея! Я просто надеялся, что есть способ поделиться какой-то общей библиотекой, так как синглтон попросит не менять код каждый раз, если что-то изменится в будущем, но я думаю, что нет никакого способа обойти его. – jgr208

+1

@ jgr208 Я не думаю, что есть способ обойти это, к сожалению. Недостатком использования перечисления является то, что вы не можете использовать 'MySingleton extends ...'. По-видимому, лучший способ реализовать синглтон, который не является перечислением, таков: http://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom –

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); 
Смежные вопросы