2011-12-18 2 views
4

Наиболее распространенный способ реализации синглтона в Java, чтобы использовать закрытый конструктор с методом общественного аксессора формы -Singleton с подклассами в Java

public class Singleton { 
    private static Singleton instance = null; 
    private Singleton() { 

    } 
    public static synchronized Singleton getInstance(){ 
     if (instance == null) { 
     instance = new Singleton();   
     } 
     return instance; 
    } 
} 

Однако, так как конструктор является частным, его предотвращает подклассу синглтона. Есть ли способ, которым мы можем сделать singleton, который позволяет подклассифицировать?

+0

http://stackoverflow.com/questions/2459061/how-can-i-implement-an-abstract-singleton-class-in-java – Dave

+0

Я бы сказал, что наиболее распространенным способом реализации синглтона является использование перечисление с одним экземпляром. –

+1

Это может быть «лучший» способ, но определенно не самый распространенный способ. Во всех проектах, над которыми я работал, синглтоны реализованы, как я показал выше. Кроме того, проверьте любую статью на Singleton в сети, и это то, что я нашел. – user496934

ответ

6

Если у вас есть class A extends B, экземпляр A по существу «включает» экземпляр B. Таким образом, сама концепция наследования противоречит синглтонной модели.

В зависимости от того, в чем вы нуждаетесь, я бы рассмотрел возможность использования композиции/делегирования. (A будет ссылаться на синглтон, а не на расширение своего класса). Если вам по наследству требуется наследование, создайте интерфейс с помощью методов Singleton, используйте Singleton для реализации этого интерфейса, а затем еще один класс также реализует этот интерфейс и передайте Singleton для реализации соответствующих методов.

+0

Можете ли вы объяснить это утверждение «вопреки синглону»? Расширение его на самом деле ничего не нарушает, поскольку вы в основном делаете класс повторно использующим функциональность синглтона, не так ли? – Boon

+1

@Boon Когда люди говорят об одном сингле, они, вероятно, означают, что существует только один объект, для которого 'instanceof TheSingleton' является истинным. Это не выполняется с наследованием, поскольку любой экземпляр 'A' также является экземпляром' B'. – yshavit

9

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

Однако вы можете просто сделать конструктор protected.

+1

Вероятно, в 90% случаев, когда метод помечен как частный, он действительно должен быть защищен. – jiggy

+0

@jiggy: Проблема с проектированием для наследования заключается в том, что он практически меняет изменения. Наследование сторонних классов, которые не были унаследованы, может вводить всевозможные тонкие проблемы (особенно повторное включение) и сделать код очень хрупким. – SLaks

+0

Спасибо. Какова цель создания конструктора одноэлементного класса 'protected'? Создание конструктора 'protected' не препятствует тому, чтобы класс singleton имел подклассы, не так ли? – Tim

0

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

Как отметил Слакс, расширение синглтона больше не будет иметь одноэлементный рисунок.

Смежные вопросы