Wzorzec projektowy fabryki – Factory Design Pattern

Page Title Shape 1
Page Title Shape 2
Page Title Shape 3

Dziś chciałbym przedstawić Ci praktyczny przykład wykorzystania wzorca projektowego “Factory Design Pattern”.

Zacznijmy może od tego na czym polega ten wzorzec. Generalnie chodzi o to, że w naszej aplikacji mamy możliwość stworzenia instancji obiektu, który będzie wybierał, jaki obiekt (zawierający implementacje metod) ma utworzyć.

Przykład, którym się posłużę, to implementacja obiektu do obsługi różnych warunków walidacji danych na podstawie lokalizacji użytkownika.

Case study

W naszej aplikacji zakładamy, że mamy użytkowników z Wielkiej Brytanii oraz Polski. Chcemy mieć gotowy obiekt, który pozwoli nam zweryfikować poprawność numeru telefonu użytkownika. Oczywiście bazujemy na lokalizacji.

Co potrzebujemy

Do wykonania tego zadania będziemy potrzebowali:

  • Fabryki, która wybierze konkretną klasę z implementacją walidacji dla konkretnego kraju
  • Dwóch klas z implementacją metody weryfikacji numeru telefonu:
    • Dla Polski
    • Dla Wielkiej Brytanii

Przykład implementacji w JavaScript

class International {
  constructor(lang){
    if(lang === "pl"){
      this.language = new IntlPolish();
    } else {
      this.language = new IntlEnglish();
    }
  }
  verifyPhone(phone) {
    return this.language.verifyPhone(phone);
  }
}

class IntlPolish {
  verifyPhone(phone) {
    return /\+48[0-9]{9}/.test(phone);
  }
}

class IntlEnglish {
  verifyPhone(phone) {
    return /\+44[0-9]{9}/.test(phone);
  }
}

// Will use IntlPolish.veryfiyPhone()
const translation = new International("pl");
// Will use IntlEnglish.veryfiyPhone()
// const translation = new International("en");

// false
console.log(translation.verifyPhone("+481"));
// true
console.log(translation.verifyPhone("+48100200300"));

Inny przykład implementacji

class International {
  getInstance(lang){
	 return lang === "pl" ? new IntlPolish() : new IntlEnglish(); 
  }
}

class IntlPolish {
  verifyPhone(phone) {
    return /\+48[0-9]{9}/.test(phone);
  }
}

class IntlEnglish {
  verifyPhone(phone) {
    return /\+44[0-9]{9}/.test(phone);
  }
}

// Will use IntlPolish.veryfiyPhone()
const translation = new International().getInstance("pl");
// Will use IntlEnglish.veryfiyPhone()
// const translation = new International().getInstance("en");

// false
console.log(translation.verifyPhone("+481"));
// true
console.log(translation.verifyPhone("+48100200300"));
Previous Post
Newer Post

Brak produktów w koszyku.

X