Проходил по “банде четырёх” и другим разрозненным источникам шаблон фабричный метод.
Вообще, сначала писал на Java пример, так как там есть все синтаксические конструкции для ООП, а потом переводил на Python, Go, JavaScript.
Фабричный метод без параметра
#!/usr/bin/env python3
from abc import ABCMeta, abstractmethod
class UnitInterface(metaclass=ABCMeta):
@abstractmethod
def what(self):
pass
class Creator(metaclass=ABCMeta):
@abstractmethod
def make_unit(self):
pass
def new_unit(self):
return self.make_unit()
class Dog(UnitInterface):
def what(self):
return 'dog'
class DogCreator(Creator):
def make_unit(self):
return Dog()
class Cat(UnitInterface):
def what(self):
return 'cat'
class CatCreator(Creator):
def make_unit(self):
return Cat()
def action(creator):
unit = creator.new_unit()
print('The {} is created.'.format(unit.what()))
def main():
action(DogCreator())
action(CatCreator())
if __name__ == '__main__':
main()
Фабричный метод с параметром
#!/usr/bin/env python3
from abc import ABCMeta, abstractmethod
import enum
class UnitInterface(metaclass=ABCMeta):
@abstractmethod
def what(self):
pass
class Dog(UnitInterface):
def what(self):
return 'dog'
class Cat(UnitInterface):
def what(self):
return 'cat'
class UnitTypes(enum.Enum):
DOG = 0
CAT = 1
class Creator:
def make_unit(self, unit_type):
if unit_type == UnitTypes.DOG:
return Dog()
elif unit_type == UnitTypes.CAT:
return Cat()
else:
raise ValueError("unit type is unknown: " + str(unit_type))
def action(creator, unit_type):
unit = creator.make_unit(unit_type)
print('The {} is created.'.format(unit.what()))
def main():
action(Creator(), UnitTypes.DOG)
action(Creator(), UnitTypes.CAT)
if __name__ == '__main__':
main()
Аналоги на Java
Фабричный метод с параметром
interface Unit {
String what();
}
class Dog implements Unit {
@Override
public String what() {
return "dog";
}
}
class Cat implements Unit {
@Override
public String what() {
return "cat";
}
}
enum UnitTypes {
DOG,
CAT
}
class Creator {
public Unit makeUnit(UnitTypes unitType) throws Exception {
if (unitType == UnitTypes.DOG) {
return new Dog();
} else if (unitType == UnitTypes.CAT) {
return new Cat();
} else {
throw new Exception("unit type is unknown: " + unitType);
}
};
}
class T {
public static void main(String args[]) {
action(new Creator(), UnitTypes.DOG);
action(new Creator(), UnitTypes.CAT);
}
private static void action(Creator creator, UnitTypes unitType) {
try {
Unit unit = creator.makeUnit(unitType);
System.out.printf("The %s is created.\n", unit.what());
} catch (Exception e) {
System.out.println(e);
}
}
}Фабричный метод без параметра
interface Unit {
String what();
}
abstract class Creator {
public abstract Unit makeUnit();
public Unit newUnit() {
return makeUnit();
};
}
class Dog implements Unit {
@Override
public String what() {
return "dog";
}
}
class DogCreator extends Creator {
@Override
public Unit makeUnit() {
return new Dog();
}
}
class Cat implements Unit {
@Override
public String what() {
return "cat";
}
}
class CatCreator extends Creator {
@Override
public Unit makeUnit() {
return new Cat();
}
}
class T {
public static void main(String args[]) {
action(new DogCreator());
action(new CatCreator());
}
private static void action(Creator creator) {
Unit unit = creator.newUnit();
System.out.printf("The %s is created.\n", unit.what());
}
}tags: oop pattern