реализовать шаблон проектирования Singleton в качестве шаблона - PullRequest
1 голос
/ 08 августа 2011

Вот вопрос:

Реализация одноэлементного шаблона проектирования в качестве шаблона таким образом, чтобы для любого заданного класса Foo вы могли вызвать Singleton :: instance () и получить указатель на экземпляр одноэлементного объекта.типа Foo.Предположим, что существует класс Lock, который имеет методы acqu () и release ().Как вы могли бы сделать вашу реализацию безопасной и исключительной?

Мой анализ:

, как отмечает Джошуа Блох в "эффективной java", лучшие способы реализации синглтон-класса - это enum и publicстатический фабричный метод.Объединение энергозависимых и синхронизированных - вот способ, которым я знаю, чтобы сделать его поточно-ориентированным и ленивым инициализировать следующим образом:

public class myS{
  private static volatile final _ins = null;
  private myS(){};
  public static myS getIns(){
    synchronized(){
      if(_ins==null) _ins = new myS();
    }
    return _ins;
  }
}  

На данный момент, я немного растерялся, чтобы сделать шаблон синглтона.Насколько я понимаю, у нас либо есть интерфейс с универсальным типом или абстрактный класс.Пока клиенты их реализуют, они одноразовые.Итак, мое предположение решение состоит в следующем:

public interface singleton<T>{
    public T instance();
}

public class Foo implements singleton<T>{
    private static volatile final Foo _ins = null;     

    public static Foo instance(){
        synchronized(this)         
             if(_ins==null){
                _ins = new Foo();
             }
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Самый простой способ получить одноэлементную функциональность - это использовать структуру Dependancy Injection (DI), такую ​​как Spring .Использование DI также дает множество других преимуществ.

0 голосов
/ 08 августа 2011

'singleton' не подходит для 'template'.Это своего рода противоречие.Если вы думаете, что вам будет лучше реализовать enums следующим образом

public enum MySingleton1 {

    ;

    public static void MethodA() { ... };

}

public enum MySingleton2 {

    ;

    public static int MethodB() { ... };

}

РЕДАКТИРОВАТЬ

Решение без перечислений будет:

public interface singletonMarker{};

public final class MySingleton1() extends singletonMarker {

    public static final MySingleton1 INSTANCE = new MySingleton1();

    private MySingleton1() {};

    public synchronized int mySyncMethod() { ... };

}

Использование

MySingleton1.INSTANCE.mySyncMethod();

Интерфейс действует только как маркер, но в этом нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...