Jak uzywac wzorca Singleton

0

Szukam informacji o wzorcach projektowych w internecie i wyczytałem, że Signleton umozliwia jednego obiektu z klasy z globalnym dostepem.
Potem jednak zatrzymuję się na nie do końca dla mnie czytelnym kodzie. Moze ktoś dobry opisać krótko jak używać singletonu na jakimś konkretnym przykładzie najlepiej podając w komentarzach obok linijki jak najprościej za co dana linijka jest odpowiedzialna? Znalazlem w internecie kilka krotkich przykładow programów, które implementują ten wzorzec, ale niestety ogolnikowo i slabo wyjasnionych.

1

Chodzi ci o zastosowanie?
Wyobraź sobie że masz aplikację desktopową którą można sobie skonfigurować i powybierać różne opcje. Działanie wsystkich funkcji aplikacji zależy od tej konfiguracji.
Powiedzmy że masz w konfiguracji do ustawienia scieżkę do katalogu z plikami wejściowymi i wyjściowymi.
Jeśli teraz w aplikacji klikas guzik "otwórz plik" to powinno pojawić się okienko wyboru pliku, ale powinno wystartować w katalogu z konfiguracji. Analogicznie jak robisz "zapisz plik". Siłą rzeczy widać, że potrzeba tej konfiguracji w różnych miejscach. Widać też ze jest tylko jedna.

0

I tak właśnie tworzymy programy, które są praktycznie nietestowalne.

0

A nie jest tak, ze singleton zapewnia jedną instancję a nie globalny dostęp?

1

Jak stosować singleton? Nie stosować. Jeśli potrzebujesz, żeby jeden obiekt miał referencję do drugiego, wrzuć mu tę referencję np. przez konstruktor albo jako argument metody.

public class A {
    private final B be;

    public A(B be) {
        this.be = be;
    }
}
0

@jarekr000000 @zyxist trochę się tu z wami nie zgadzam, bo mylicie ideę z konkretną metodą implementacji. To troche jakby hejtować Dependency Injection bo ktos nie lubi kontenerów IoC.
Singleton oznacza generalnie, że mamy jedną instancję obiektu oraz zapewniony do niego dostęp, ale wcale nie musi koniecznie ozaczać że mamy tam klasyczne statyczne getInstance() albo coś podobnego, co potem utrudnia testowanie. Wydaje mi się że wstrzykniecie (w dowolny sposób) takiego singletona wcale nie odbiera mu nic z singletonowości.
Zresztą bardzo często w ogóle nie zależy nam koniecznie na tym żeby mieć jeden obiekt, a na tym, żeby operować na tym samym stanie, jak w patternie Borg.

@jarekr000000 dobrze wiesz, że poza enumem nie da się wymusić, żeby istniała tylko jedna instancja. Jak ktoś chce to zawsze może sobie drugą stworzyć, w bardziej lub mniej hardkorowy sposób ;)

0

Pomijając fakt, że zawsze można hardkorowo stworzyć instancję to nie sądzisz, że ten Singleton umowny to troszkę słabizna.
Dziadowie założyciele Javy wymyślali jakieś public, private, a my tu robimy wszystko public i umawiamy się, że będziemy pamiętać, żeby niektórych konstruktorów i metod nie wywoływać, bo niu - niu. Piękne.

0

tak ogolnie to jest antywzorzec. jedyne sensowne uzycie jakie przychodzi mi do glowy to do bezstanowych klas implementujacych jakis interfejs (t.j. null object) ale i to jest raczej dyskusyjne

1

Taki mały offtopic, bo @jarekr000000 i @Shalom trochę popłynęli :)

  1. Singleton jako wzorzec projektowy ma zastosowanie wszędzie tam gdzie nie ma sensu tworzenie wielu instancji obiektów TEJ SAMEJ KLASY. Przykładem jest konfiguracja, ale też np. obiekty fabryk, czy też bezstanowe usługi.
  2. Czym innym jest jednak wstrzykiwanie singletonów, ponieważ to powinno opierać się o interfejsy. W ten sposób w jednym systemie możesz mieć wiele singletonów, które implementują ten sam interfejs.
  3. Testowalność zależy od tego jak używasz singletonu i jak go inicjujesz. Jeżeli używasz go jako zależności, którą wstrzykujesz przez konstruktor i powiązanie pomiędzy twoim kodem a singletonem jest na poziomie interfejsu, to kod nadal jest testowalny. Pytanie jak przetestować singleton?
  • Jeżeli jest bezstanowy i nie ma żadnych zależności/zależności przyjmuje w jako argumenty poszczególnych metod, to pikuś.
  • Jeżeli jest bezstanowy, ale ma zależności, to należy tak przygotować jego inicjalizację, by można było konfigurować nasz obiekt. Metoda fabrykująca jest całkiem OK.
  • Jeżeli jest stanowy, to masz problem.
0

@Shalom, autor pytał o konkretny wzorzec projektowy, a nie o ideę:

Szukam informacji o wzorcach projektowych w internecie i wyczytałem, że Signleton umozliwia jednego obiektu z klasy z globalnym dostepem.

To jest oczywiste, że w aplikacji będą klasy, których liczba instancji wynosi 1 i chyba nikt tutaj tego nie zanegował.

1 użytkowników online, w tym zalogowanych: 0, gości: 1