JavaRush/Java Π±Π»ΠΎΠ³/Random/ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #267. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования Π² Java, ...

ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #267. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования Π² Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ Random
участников
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: Medium Π”Π°Π½Π½ΠΎΠ΅ руководство ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ примСнСния Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярных шаблонов проСктирования: Singleton, Strategy, Factory, Abstract Factory ΠΈ Builder. ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #267. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования Π² Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ - 1

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования?

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ (ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹) проСктирования β€” это ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния. Они ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ²ΠΎΠΉ ΠΎΠΏΡ‹Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ, эффСктивного ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π² сопровоТдСнии способа Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… систСм. Богласно извСстной ΠΊΠ½ΠΈΠ³Π΅ β€œΠ¨Π°Π±Π»ΠΎΠ½Ρ‹ проСктирования: элСмСнты ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡβ€ авторства Π­Ρ€ΠΈΡ…Π° Π“Π°ΠΌΠΌΠ°, Π ΠΈΡ‡Π°Ρ€Π΄Π° Π₯Π΅Π»ΠΌΠ°, Π Π°Π»ΡŒΡ„Π° ДТонсона ΠΈ Π”ΠΆΠΎΠ½Π° ВлиссидСса, сущСствуСт 23 шаблона проСктирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ Π½Π° Ρ‚Ρ€ΠΈ основныС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ:

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ творчСского проСктирования:

Π­Ρ‚Π° катСгория шаблонов ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, скрывая ΠΏΡ€ΠΈ этом Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ создания экзСмпляров. Они Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΡƒΡŽΡ‚ процСсс создания экзСмпляров, дСлая систСму Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎΠΉ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΠΉ. Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ распространСнныС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ творчСского проСктирования: Singleton, Factory, Abstract Factory, Builder ΠΈ Prototype.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования:

Они Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ классов ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для формирования Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… структур, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΈΠΌ эффСктивно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ вмСстС. Π’ Π³Ρ€ΡƒΠΏΠΏΡƒ шаблонов структурного проСктирования входят: Adapter, Bridge, Composite, Decorator, Facade ΠΈ Proxy.

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ повСдСнчСского проСктирования:

Π­Ρ‚Π° катСгория шаблонов фокусируСтся Π½Π° ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ для достиТСния ΠΎΠ±Ρ‰Π΅ΠΉ Ρ†Π΅Π»ΠΈ. К распространСнным шаблонам повСдСнчСского проСктирования относятся: Command, Iterator, Observer, Strategy. ΠšΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊ #267. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования Π² Java, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ - 2

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° шаблонов проСктирования

  1. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования: ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ….
  2. Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ: ΠΎΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ наш ΠΊΠΎΠ΄ Π³ΠΈΠ±ΠΊΠΈΠΌ ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊ измСнСниям. Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ наш ΠΊΠΎΠ΄ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ влияниСм Π½Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄.
  3. БотрудничСство: Они Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстны срСди Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈ внСсти свой Π²ΠΊΠ»Π°Π΄ Π² ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ.
  4. РСшСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ: ΠΎΠ½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π½Π°ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ проСктирования, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π»ΡƒΡ‡ΡˆΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.
  5. БоотвСтствиС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ открытости-закрытости: ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Π¨Π°Π±Π»ΠΎΠ½ Singleton

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ шаблон Singleton, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр нашСго класса ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ доступа ΠΊ Π½Π΅ΠΌΡƒ. БущСствуСт Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ шаблона проСктирования Singleton:
  1. Π Π°Π½Π½Π΅Π΅ созданиС экзСмпляра: ΠΌΡ‹ создаСм экзСмпляр Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.
  2. Π›Π΅Π½ΠΈΠ²ΠΎΠ΅ созданиС экзСмпляра: ΠΌΡ‹ создаСм экзСмпляр, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.
Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ класс Singleton, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ:
  • статичСский (static) Ρ‡Π»Π΅Π½ класса
  • частный (private) конструктор (ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ созданиС экзСмпляра одноэлСмСнтного класса Π²Π½Π΅ класса)
  • статичСский Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ (прСдоставляСт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ для доступа ΠΊ одноэлСмСнтному ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ экзСмпляр ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ)
Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ быстрой Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ шаблона Singleton:
public class NotificationService {

    // Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π² статичСском Π±Π»ΠΎΠΊΠ΅
    private static final NotificationService instance = new NotificationService();

    private NotificationService() {
    }

    public static NotificationService getInstance() {
        return instance;
    }

    public void sendNotification(String message) {
        // Π›ΠΎΠ³ΠΈΠΊΠ° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ увСдомлСния
        System.out.println("Notification sent " + message);
    }
}
ΠŸΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ экзСмпляр NotificationService создаСтся ΠΈ инициализируСтся Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. ΠœΠ΅Ρ‚ΠΎΠ΄ getInstance() просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ экзСмпляр. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π»Π΅Π½ΠΈΠ²ΠΎΠΉ (lazy) Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ шаблона Singleton:
public class NotificationService {

    private static NotificationService instance;

    private NotificationService() {
    }

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

    public void sendNotification(String message) {
        // Π›ΠΎΠ³ΠΈΠΊΠ° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ увСдомлСния
        System.out.printf("Notification sent: %s", message);
    }
}
Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях, особСнно ΠΊΠΎΠ³Π΄Π° созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° являСтся рСсурсоСмким ΠΈ дорогостоящим, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ. Π’Π°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ запуск ΠΈ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ использованиС памяти. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ потокобСзопасным, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π΅Π΅Π½Ρ‚Π΅Ρ€Π°Π±Π΅Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ (reentrant lock) ΠΈΠ»ΠΈ синхронизированный Π±Π»ΠΎΠΊ.
public class NotificationService {
    // РСшСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ видимости Π² многопоточности с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова volatile
    private static volatile NotificationService instance;

    private NotificationService() {
    }

    public static NotificationService getInstance() {
        if (instance == null) {
            synchronized (NotificationService.class) {
                if (instance == null) {
                    instance = new NotificationService();
                }
            }
        }
        return instance;
    }

    public void sendNotification(String message) {
        System.out.printf("Notification sent: %s", message);
    }
}
ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ статичСский Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ нашСго класса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ экзСмпляр:
public  class  SingletonClient {

    public  static  void  main (String[] args) {
        // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ одноэлСмСнтного экзСмпляра слуТбы ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
        NotificationService  NotificationService  = NotificationService.getInstance();

        // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
         NotificationService.sendNotification( "Hello world!" );
    }
}
Π’ срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Spring синглтон являСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ дСйствия ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Spring. Когда Π²Ρ‹ опрСдСляСтС bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² Spring Π±Π΅Π· указания области дСйствия, ΠΎΠ½ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ считаСтся одноэлСмСнтным. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, явно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Π΅Π³ΠΎ Π² классС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ @Bean ΠΈΠ»ΠΈ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π² ваш класс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ @Component.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public NotificationService notificationService() {
        return new NotificationService();
    }
}

Π¨Π°Π±Π»ΠΎΠ½ Strategy

Π¨Π°Π±Π»ΠΎΠ½ проСктирования Strategy (БтратСгия) β€” это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· шаблонов повСдСнчСского проСктирования. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ нСсколько Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΈ позволяСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²ΠΎ врСмя выполнСния, инкапсулируя ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈ дСлая эти Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ взаимозамСняСмыми. ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ шаблона проСктирования Strategy:
  1. ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚: это класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ссылку Π½Π° интСрфСйс стратСгии ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ стратСгиями.
  2. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ стратСгии: интСрфСйс, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ стратСгии.
  3. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ стратСгии: это Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса стратСгии. КаТдая конкрСтная стратСгия прСдусматриваСт свой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.
// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Strategy
public interface PaymentStrategy {
  void pay(BigDecimal amount);
}

// ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ стратСгии
@Component
public class CreditCardStrategy implements PaymentStrategy {

  public void pay(BigDecimal amount) {
    System.out.printf("Amount %s paid using CreditCardStrategy", amount);
  }
}

@Component
public class PayPalStrategy implements PaymentStrategy {

  public void pay(BigDecimal amount) {
    System.out.printf("Amount %s paid using PayPalStrategy", amount);
  }
}
Π£ нас Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° способов ΠΎΠΏΠ»Π°Ρ‚Ρ‹: крСдитная ΠΊΠ°Ρ€Ρ‚Π° ΠΈ PayPal.
public enum PayMethod {
  PAYPAL("payPal"),
  CREDIT_CARD("creditCard");

  private final String value;

  PayMethod(String value) {
    this.value = value;
  }

  public String getValue() {
    return value;
  }
}
Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ контСкст PaymentContext ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ стратСгии Π² EnumMap. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ApplicationContext Π² Spring для динамичСского извлСчСния bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π° ΠΈ отдСляСт ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΎΡ‚ Π»ΠΎΠ³ΠΈΠΊΠΈ.
@Component
public class PaymentContext {

  private static final String BEAN_SUFFIX = "Strategy";

  @Autowired
  private ApplicationContext context;

  private EnumMap strategies;

  public void processPayment(PayMethod payMethod, BigDecimal amount) {
    PaymentStrategy paymentStrategy = strategies.get(payMethod);
    if (paymentStrategy == null) {
      throw new IllegalArgumentException("No strategy found for PayMethod: " + payMethod);
    }

     paymentStrategy.pay(amount);
  }

  @PostConstruct
  public void init() {
    this.strategies = new EnumMap<>(PayMethod.class);
    Arrays.stream(PayMethod.values())
      .forEach(payMethod -> strategies.put(payMethod, (PaymentStrategy) context.getBean(payMethod.getValue() + BEAN_SUFFIX)));}
  }
}
Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ processPayment, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ класс для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠΏΠ»Π°Ρ‚Ρ‹:
public class StrategyClient {

  public static void main(String[] args) {
    ApplicationContext springContext = new AnnotationConfigApplicationContext("com.mina.strategy");
    PaymentContext paymentContext = springContext.getBean(PaymentContext.class);

    paymentContext.processPayment(PayMethod.CREDIT_CARD, new BigDecimal(10.50));
    paymentContext.processPayment(PayMethod.PAYPAL, new BigDecimal(60.20));
  }
}
Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого шаблона ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ стратСгии ΠΎΠΏΠ»Π°Ρ‚Ρ‹ Π±Π΅Π· измСнСния контСкста, ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡΡΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° открытости-закрытости ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID.

Π¨Π°Π±Π»ΠΎΠ½ Factory

Π€Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ шаблон (Factory) β€” это шаблон проСктирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡƒ связанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° основС критСрия, Π½Π΅ раскрывая ΠΈΡ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ классы. Он абстрагируСт процСсс создания экзСмпляра. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ интСрфСйс для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ классы, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ этот интСрфСйс, для создания экзСмпляров ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΡ‹ создадим Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы ΠΎΠΏΠ»Π°Ρ‚Ρ‹:
// Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Payment
public interface Payment {
    void processPayment();
}

// РСализация интСрфСйса Payment
public class CreditCardPayment implements Payment {

    @Override
    public void processPayment() {
        System.out.println("Processing payment using Credit Card...");
    }
}

public class PayPalPayment implements Payment {

    @Override
    public void processPayment() {
        System.out.println("Processing payment using PayPal...");
    }
}


public class PaymentFactory {

    public static Payment createPayment(PayMethod payMethod) {
      if (payMethod == PayMethod.CREDIT_CARD) {
        return new CreditCardPayment();
      } else if (payMethod == PayMethod.PayPal) {
        return new PayPalPayment();
      }
    }
  }

public class FactoryClient {

    public static void main(String[] args) {
        // ИспользованиС factory для создания способа ΠΎΠΏΠ»Π°Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Credit Card ΠΈ PayPal
        Payment creditCardPayment = PaymentFactory.createPayment(PayMethod.CREDIT_CARD);
        creditCardPayment.processPayment();

        Payment payPalPayment = PaymentFactory.createPayment(PayMethod.PayPal);;
        payPalPayment.processPayment();
    }
}
Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Payment β€” это интСрфСйс для Ρ€Π°Π·Π½Ρ‹Ρ… способов ΠΎΠΏΠ»Π°Ρ‚Ρ‹, Π° CreditCardPayment ΠΈ PayPalPayment β€” Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Класс PaymentFactory ΠΈΠΌΠ΅Π΅Ρ‚ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ PatMethod для создания экзСмпляра ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Payment. ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Factory для создания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… экзСмпляров ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ΅ΠΉ. Π­Ρ‚ΠΎ позволяСт Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ возмоТности добавлСния Π½ΠΎΠ²Ρ‹Ρ… способов ΠΎΠΏΠ»Π°Ρ‚Ρ‹ Π±Π΅Π· измСнСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ клиСнтского ΠΊΠΎΠ΄Π°.

Π¨Π°Π±Π»ΠΎΠ½ Abstract Factory

Π¨Π°Π±Π»ΠΎΠ½ β€œΠΠ±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½Π°Ρ фабрика” (Abstract Factory) β€” это шаблон проСктирования, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ. Он являСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ шаблона Factory, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π΄Π²ΡƒΡ…ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ ΠΈΠ»ΠΈ иСрархичСский Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ шаблон. Π‘Π½Π°Ρ‡Π°Π»Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр Factory для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для получСния ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² этой ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. Основная идСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ клиСнтский ΠΊΠΎΠ΄ взаимодСйствуСт с абстрактными интСрфСйсами (абстрактной Ρ„Π°Π±Ρ€ΠΈΠΊΠΎΠΉ ΠΈ абстрактными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ), Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ Ρ„Π°Π±Ρ€ΠΈΠΊΠ°ΠΌΠΈ. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ абстрактного шаблона Factory для создания ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠΈ (buttons), TextField ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅) со свСтлой ΠΈΠ»ΠΈ Ρ‚Π΅ΠΌΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΠΎΠΉ.
// Abstract Product: Button
interface Button {
    void display();
}

// Concrete Product: LightButton
class LightButton implements Button {
    public void display() {
        System.out.println("Displaying Light Button");
    }
}

// Concrete Product: DarkButton
class DarkButton implements Button {
    public void display() {
        System.out.println("Displaying Dark Button");
    }
}

// Abstract Product: TextField
interface TextField {
    void display();
}

// Concrete Product: LightTextField
class LightTextField implements TextField {
    public void display() {
        System.out.println("Displaying Light Text Field");
    }
}

// Concrete Product: DarkTextField
class DarkTextField implements TextField {
    public void display() {
        System.out.println("Displaying Dark Text Field");
    }
}
Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ интСрфСйс абстрактной Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ с Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° абстрактного ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ абстрактный Ρ„Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ интСрфСйс для создания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ².
// Abstract Factory: UIFactory
interface UIFactory {
    Button createButton();
    TextField createTextField();
}

// Concrete Factory: LightUIFactory
class LightUIFactory implements UIFactory {
    public Button createButton() {
        return new LightButton();
    }

    public TextField createTextField() {
        return new LightTextField();
    }
}

// Concrete Factory: DarkUIFactory
class DarkUIFactory implements UIFactory {
    public Button createButton() {
        return new DarkButton();
    }

    public TextField createTextField() {
        return new DarkTextField();
    }
}
Π’ΠΎΡ‚ ΠΊΠ°ΠΊ наш ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ абстрактный шаблон Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ.
public class AbstractFactoryClient {

    public static void main(String[] args) {
        // Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΡΠ²Π΅Ρ‚Π»ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ
        UIFactory lightFactory = new LightUIFactory();
        Button lightButton = lightFactory.createButton();
        TextField lightTextField = lightFactory.createTextField();

        lightButton.display(); // Π’Ρ‹Π²ΠΎΠ΄: ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ свСтлой ΠΊΠ½ΠΎΠΏΠΊΠΈ
        lightTextField.display(); // Π’Ρ‹Π²ΠΎΠ΄: ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ свСтлого тСкстового поля

        // Π’Ρ‹Π±ΠΎΡ€ Ρ‚Π΅ΠΌΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΡ‹
        UIFactory darkFactory = new DarkUIFactory();
        Button darkButton = darkFactory.createButton();
        TextField darkTextField = darkFactory.createTextField();

        darkButton.display(); // Π’Ρ‹Π²ΠΎΠ΄: ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΌΠ½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ
        darkTextField.display(); // Π’Ρ‹Π²ΠΎΠ΄: ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΌΠ½ΠΎΠ³ΠΎ тСкстового поля
    }
}

Π¨Π°Π±Π»ΠΎΠ½ Builder (Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒ)

Builder β€” это шаблон, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ слоТныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Основная Π΅Π³ΠΎ идСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ построСниС слоТного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΡ‚ Π΅Π³ΠΎ прСдставлСния, позволяя ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ процСссу конструирования ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ прСдставлСния. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ шаблон Builder для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π”Π²Π° ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° β€” это классы UserBuilder ΠΈ User.
  • Класс UserBuilder инкапсулируСт созданиС экзСмпляра ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° User, прСдоставляя ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для установки свойств ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
  • Класс User прСдставляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, экзСмпляр ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ создаСтся, ΠΈ содСрТит фактичСскиС свойства.
public class User {

  private final String ssn; //трСбуСтся
  private final String firstName; //трСбуСтся
  private final String lastName; //трСбуСтся
  private final String phone; //Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ
  private final String address; //Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ

  private User(UserBuilder builder) {
    this.ssn = builder.ssn;
    this.firstName = builder.firstName;
    this.lastName = builder.lastName;
    this.phone = builder.phone;
    this.address = builder.address;
  }
  public String getSsn() {
    return ssn;
  }

  public String getFirstName() {
    return firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public String getPhone() {
    return phone;
  }

  public String getAddress() {
    return address;
  }

  @Override
  public String toString() {
    return "User{" +
      "ssn='" + ssn + '\'' +
      ", firstName='" + lastName + '\'' +
      ", lastName='" + lastName + '\'' +
      ", phone='" + phone + '\'' +
      ", address='" + address + '\'' +
      '}';
  }

  public static class UserBuilder {

    private final String ssn;
    private final String firstName;
    private final String lastName;
    private String phone;
    private String address;

    public UserBuilder(String ssn, String firstName, String lastName) {
      this.ssn = ssn;
      this.firstName = firstName;
      this.lastName = lastName;
    }

    public UserBuilder phone(String phone) {
      this.phone = phone;
      return this;
    }

    public UserBuilder address(String address) {
      this.address = address;
      return this;
    }

    public User build() {
      return new User(this);
    }
  }
}
Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ шаблон Builder:
public class UserBuilderClient {

  public static void main(String[] args) {
    User user = new User.UserBuilder("553388", "Mina", "Rashidi")
      .address("Stockholm")
      .build();
    System.out.println(user);
  }
}

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° шаблона Builder:

  • НСт нСобходимости ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ конструктор.
  • НСт нСобходимости Π² конструкторС с Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ списком ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².
  • Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ Π² создании экзСмпляров ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ свойств. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для слоТных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ свойствами.
  • ΠΠ΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ: ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π² создании нСизмСняСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ измСнСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° послС Π΅Π³ΠΎ создания, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ случайныС измСнСния.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ удобство обслуТивания. Он Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Π² сопровоТдСнии, отдСляя ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΡ‚ Π΅Π³ΠΎ прСдставлСния.
Π― надСюсь, Ρ‡Ρ‚ΠΎ это руководство ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ Π²Π°ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования ΠΈ способы ΠΈΡ… эффСктивного использования.
ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ (1)
  • популярныС
  • Π½ΠΎΠ²Ρ‹Π΅
  • старыС
Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ
Yuliya Software Testing Engineer
14 дСкабря 2023, 15:42
Π‘Ρ‚Π°Ρ‚ΡŒΡ πŸ”₯