Kreacyjny wzorzec projektowy: 1. Pojedynczy wzorzec

Co to jest kreacyjny wzorzec projektowy?

(26 grudnia 2020 r.)

Kreacyjne wzorce projektowe dotyczą tworzenia lub klonowania nowych obiektów klasy. Klonowanie ma miejsce, gdy podobny rodzaj obiektu już istnieje i zamiast tworzyć instancję nowego obiektu, klonujemy już istniejący.

Różne sposoby tworzenia obiektów będą miały duży wpływ na sposób rozwiązania problemu. Dlatego różne języki wpływają na możliwe wzorce.

Wzorzec singleton

Wzorzec singleton jest używany, gdy potrzebujemy tylko jednej instancji klasy. Na przykład, nawiązanie połączenia DB w aplikacji, kolejka wydruku drukarki, korzystanie z rejestratorów, ponieważ wymagają dużej ilości zasobów. We wszystkich tych przypadkach, jeśli istnieje wiele instancji, spowoduje to zamieszanie i niespójność.

Ten wzorzec jest używany, gdy instancja jest współużytkowana i dostępna globalnie w całej aplikacji. Upewnienie się, że dostęp do współdzielonych zasobów jest bezpieczny dla wątków, jest jednym z bardzo dobrych przykładów tego, gdzie tego rodzaju wzorzec może mieć kluczowe znaczenie. celem wzorca Singleton jest zapewnienie globalnego dostępu do klasy, która jest ograniczona do jednej instancji.

Zobaczmy, jak tworzony jest obiekt

public class DummyClass{ DummyClass(){}
}DummyClass dc = new DummyClass(); //every time when this line is called a new object of DummyClass is created

Teraz, gdy potrzebny jest obiekt DummyClass, wywoływany jest jego konstruktor i tworzony jest obiekt. Nazywa się to inicjalizacją Eager.

Ale we wzorcu pojedynczym wymagamy tylko jednej instancji klasy. Powiedzmy, że jeśli połączenie DB jest już skonfigurowane, nie musimy tworzyć nowego połączenia DB i powinniśmy używać już istniejącego połączenia. Zobaczmy, jak to osiągnąć.

Tutaj ograniczyliśmy zakres konstruktora do samej klasy. Aby więc stworzyć obiekt tej klasy, należy wywołać statyczną metodę getDBConnection () tej klasy. Następnie sprawdzi, czy obiekt dbConnection ma wartość null, a następnie utworzy nowy obiekt połączenia i zwróci istniejący obiekt połączenia.

W tym przykładzie przedstawiono koncepcję leniwa inicjalizacja . Oznacza to, że nie tworzymy obiektu klasy, chyba że jest naprawdę potrzebny. W związku z tym ten program jest bardziej wydajny pod względem zasobów.

Istnieją pewne kompromisy z zasadą projektowania Singleton. Jeśli jest uruchomionych wiele wątków obliczeniowych, mogą wystąpić problemy spowodowane przez wątki próbujące uzyskać dostęp do udostępnionego pojedynczego obiektu.

Problemy z powyższą implementacją

Teraz możliwe, że dwa wątki jednocześnie wywołują metodę getDBConnection i obiekt nie jest jeszcze tworzony. W przypadku obu wątków obiekt dbConnection będzie miał wartość NULL i oba będą próbowały utworzyć nową instancję i zamiast tego użyć jej. Dlatego bardzo ważne jest, aby upewnić się, że pojedynczy wątek może uzyskać dostęp do getDBConnection naraz, aby nie tworzyć wielu instancji.

Aby uzyskać wątek -safe klasa pojedyncza ma na celu zsynchronizowanie globalnej metody dostępu, tak aby tylko jeden wątek mógł wykonywać tę metodę naraz.

Tylko jeden wątek może uzyskać dostęp do tego zsynchronizowanego bloku kodu naraz

Możesz pomyśleć, że problem został już rozwiązany. Ale niestety nie! Aby wymusić właściwość singleton, nałożyliśmy blokadę na statyczną metodę getDBConnection, jednocześnie obniżając jej wydajność. Gdy obiekt jest już utworzony, wiele wątków musi również czekać, aby uzyskać istniejącą instancję tego obiektu. Czy możemy zrobić coś lepszego? Zobaczmy.

Jak widać, blokada jest wymagana tylko wtedy, gdy instancja ma wartość null, aby różne wątki nie tworzyły wielu instancji. Zatem możemy umieścić zsynchronizowany warunek wewnątrz warunku if, w którym sprawdzamy, czy instancja ma wartość null, i dodać podwójne sprawdzenie, aby wyeliminować scenariusze wielu instancji.

W praktyce wzorzec singletona można zaimplementować na różne sposoby. Po prostu definiuje podstawowy cel, któremu służy ten wzorzec, ale implementacja kodu może się różnić.

To wszystko z mojej strony. Mam nadzieję, że teraz jest jasne, gdzie, kiedy i jak używać wzorca projektowania singleton. Możesz zapoznać się z książką, katalogiem wzorców projektowych Gang of Four, aby uzyskać więcej informacji.

Jeśli masz jakiekolwiek wątpliwości, daj mi znać w komentarzach poniżej. Jeśli podoba Ci się ten blog, udostępnij go znajomym. Miłej inżynierii oprogramowania!

Część 2: