2009-09-30 2 views

ответ

22

Каждый класс может реализовать интерфейс, а Singleton - это просто «нормальный» класс, который гарантирует, что только один его экземпляр существует в любой момент времени, кроме другой бизнес-логики, которую он может реализовать. Это также означает, что у Singleton есть как минимум 2 ответственности, и это не очень хороший дизайн OO, поскольку классы должны иметь только 1 ответственность и убедиться, что они хорошо справляются с этой ответственностью, но это еще одна дискуссия.

+0

Почему Синглтон не является хорошим дизайном OO? На самом деле это один из наиболее распространенных шаблонов проектирования OO. –

+2

@ChristianVielma: (Да, поздно) Проблема заключается в том, что он создает * глобальное состояние *, как и глобальные переменные *, и страдает от подобных проблем. Например, трудно тестировать классы, которые внутренне запрашивают одиночные игры без внешних знаний. Ваша производственная БД полна данных мусора/теста? Проверьте наличие синглетов. Охота на ошибку? Если у вас есть одноточие и, следовательно, глобальное состояние, вы не можете просто сосредоточиться на ограниченном объеме; вы должны помнить о кодовой базе. Спасибо синглтон. Обратите внимание, что речь идет об singleton * pattern *, а не о singleton * objects *. Общее использование не означает, что оно должно быть «хорошим». – ray

0

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

10

Что-то вроде:

public interface MyInterface 
{ 
} 

И

public class MySingleton implements MyInterface 
{ 
    private static MyInterface instance = new MySingleton(); 

    private MySingleton() 
    { 
    } 

    public static MyInterface getInstance() 
    { 
    return instance; 
    } 
} 
+2

Вам нужно добавить частный конструктор no-args в этот класс, чтобы сделать его одиночным. –

+7

FYI, лучший способ в Java реализовать Singleton - это использовать одноэлементное перечисление.Это более красноречиво, чем подход, основанный на общественном поле, и обеспечивает бесплатный механизм сериализации, а также обеспечивает защиту от отражений. Этот метод еще предстоит широко применять, но может быть интересно узнать. Для получения дополнительной информации см. Статью об этом в «Эффективной Java» Джошуа Блоха. – nkr1pt

+0

@ Андрю: спасибо, я подпрыгивал между SO и работой дня и пропустил это случайно :-) –

0

В принципе, класс синглтон это класс, который может быть реализован один и только один раз. Шаблон одноэлементного типа реализуется с использованием статического метода для получения экземпляра одноэлементного класса и ограничения доступа к его конструктору.

Как и при использовании интерфейса, он будет аналогичен тому, как любой другой класс будет реализовывать интерфейс.

А также он не должен допускать клонирование этого объекта.

5

Я думаю, что я понял вашу проблему. Вы хотите определить фабричный метод в интерфейсе (статический метод getInstance()). Но поскольку заводский метод не может быть определен в интерфейсе, эта логика не будет работать.

Один из вариантов - иметь фабричный класс, который содержит этот статический метод. Так что будет три класса первого класса провести статический метод вторым является интерфейсом третьим является конкретным классом

Но мы не можем сделать конкретный конструктор приватным.

Но если ваша инфраструктура имеет два пакета один для общественных и других для частных

определяют интерфейс в общественных местах, сделать конкретный уровень пакетов класса (с любым модификатором доступа) и Factory класс и статический методом являются публичными.

Надеюсь, это может вам помочь.