Factory Method. Паттерн Фабрика.

Фабричный метод - это порождающий шаблон проектирования, который предоставляет интерфейс для создания объектов в родительском классе,  но позволяет подклассам изменять тип создаваемых объектов.

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

Создадим интерфейс костюмов:

interface Suit {
void showSuit();
}


Будет два вида производимой продукции это мужские и женские костюмы. Создадим два класса, которые будут наследоваться от интерфейса Suit:

class SuitForMan

class SuitForMan implements Suit {

@Override
public void showSuit() {
System.out.println("Костюм для мужчин");
}
}


и class SuitForWomen

class SuitForWomen implements Suit {

@Override
public void showSuit() {
System.out.println("Костюм для женщин");
}
}


Создадим фабричный интерфейс, саму "Фабрику" по производству костюмов - фабрику "Большевичка"

interface TheBolshevichkaFactory

interface TheBolshevichkaFactory {
Suit createSuit();
}


У этой фабрики будет две линии по производству мужской и женской одежды:

class ClothingLineForMen

class ClothingLineForMen implements TheBolshevichkaFactory {

@Override
public Suit createSuit() {
return new SuitForMan();
}

}


и class ClothingLineForWomen

class ClothingLineForWomen implements TheBolshevichkaFactory {

@Override
public Suit createSuit() {
return new SuitForWomen();
}
}


Создадим линию по производству мужских(или) женских костюмов и выпустим мужской костюм

public class Main {
public static void main(String[] args) {

TheBolshevichkaFactory theBolshevichkaFactory = new ClothingLineForMen();
Suit suit = theBolshevichkaFactory.createSuit();
suit.showSuit();
}

}


Также, можно воспользоваться фабричным методом

public class Main {
public static void main(String[] args) {

TheBolshevichkaFactory theBolshevichkaFactory = getSuitByName("Man");
Suit suit = theBolshevichkaFactory.createSuit();
suit.showSuit();
}

// Фабричный метод
public static TheBolshevichkaFactory getSuitByName(String maker) {
if (maker.equals("Man")) {

return new ClothingLineForMen();
} else if (maker.equals("Woman")) {

return new ClothingLineForWomen();
}

return null;
}

}


Пример на GitHub