Шаблон фабрика (Factory)

  • 23 января, 2023

Шаблон фабрика (Factory)

Шаблон фабрика (Factory)

Шаблон фабрика (Factory) использует класс Factory, чтобы возвратить экземпляр определенного класса на основе переданных классу данных.

Например, ниже мы определили 3 класс Baby, Child, Adult. Каждый из которых наследует абстрактный класс Person.

Далее мы создаем экземпляр фабрики: factory = new PersonFactory();.

Далее при помощи фабричного метода factory.getPerson мы создаем экземпляр класса (из трех возможных Baby, Child, Adult) в зависимости от даты, которая передается фабричному методу.

enum PersonCategory {
Baby,
Child,
Adult
}

interface IPerson {
Category: PersonCategory;
canSign(): boolean;
showDetails(): void;
}

abstract class Person implements IPerson {
Category: PersonCategory;
private DateOfBirth: Date;

constructor(dateOfBirth: Date) {
this.DateOfBirth = dateOfBirth;
this.Category = PersonCategory.Undefined;
}

abstract canSign(): boolean

showDetails(): void {
console.log(`Персона : `);
console.log(`День рождения : `
+ `${this.DateOfBirth.toDateString()}`);
console.log(`Категория : `
+ `${PersonCategory[this.Category]}`);
console.log(`Может ставить подпись : `
+ `${this.canSign()}`);
}
}

class Baby extends Person {
constructor(dateOfBirth: Date) {
super(dateOfBirth);
this.Category = PersonCategory.Baby;
}
canSign(): boolean { return false; }
}

class Child extends Person {
constructor(dateOfBirth: Date) {
super(dateOfBirth);
this.Category = PersonCategory.Child;
}
canSign(): boolean { return false; }
}

class Adult extends Person {
constructor(dateOfBirth: Date) {
super(dateOfBirth);
this.Category = PersonCategory.Adult;
}
canSign(): boolean { return true; }
}

class PersonFactory {
getPerson(dateOfBirth: Date): IPerson {
let dateNow = new Date(),
currentMonth = dateNow.getMonth() + 1,
currentDate = dateNow.getDate();

let dateTwoYearsAgo = new Date(
dateNow.getFullYear() — 2,
currentMonth, currentDate);

let date18YearsAgo = new Date(
dateNow.getFullYear() — 18,
currentMonth, currentDate);

if (dateOfBirth >= dateTwoYearsAgo) {
return new Baby(dateOfBirth);
}
if (dateOfBirth >= date18YearsAgo) {
return new Child(dateOfBirth);
}
return new Adult(dateOfBirth);
}
}

let factory = new PersonFactory();
let p1 = factory.getPerson(new Date(2019, 0, 22));
p1.showDetails();
let p2 = factory.getPerson(new Date(2010, 0, 22));
p2.showDetails();
let p3 = factory.getPerson(new Date(1979, 0, 22));
p3.showDetails();

Взято с http://web.archive.org/web/20200120194813/http://www.coldfox.ru:80/article/5de3ea06ad46d302327482b7/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD-%D1%84%D0%B0%D0%B1%D1%80%D0%B8%D0%BA%D0%B0-Factory