Wzorzec projektowy fabryki – Factory Design Pattern

15 maja 2020

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"));

Na koniec skrzynia skarbów – newsletter. Znajdziesz w nim link do zapisu na darmowe 45-minutowe konsultacje online. Nie ma go w innym miejscu, tylko w wiadomościach ode mnie. A razem z nim dostaniesz w mailach czyste złoto, czyli wiedzę. Zero spamu.

Zapisz się na newsletter

.

Tu też znajdziesz wiedzę za darmo

Po rozwiązania zajrzyj również na octocode’owy kanał na YouTube’ie. Będzie Twoją latarnią morską w programowaniu.

Lubisz słuchać rozmów z ciekawymi ludźmi z branży? Zapraszam na Prograduchy – podcast na luzie, a jednocześnie merytoryczny. Nie odpłyniesz.

X