Абстрактные фабричные шаблоны работают вокруг суперфабрики, которая создает другие фабрики. Эта фабрика также называется фабрикой фабрик. Этот тип шаблона проектирования подпадает под шаблон создания, поскольку этот шаблон обеспечивает один из лучших способов создания объекта.
В шаблоне Abstract Factory интерфейс отвечает за создание фабрики связанных объектов без явного указания их классов. Каждая сгенерированная фабрика может давать объекты в соответствии с шаблоном фабрики.
Реализация
Мы собираемся создать интерфейсы Shape и Color и конкретные классы, реализующие эти интерфейсы. В качестве следующего шага мы создадим абстрактный фабричный класс AbstractFactory . Фабричные классы ShapeFactory и ColorFactory определяются там, где каждая фабрика расширяет AbstractFactory . Создатель фабрики / генератор класса FactoryProducer создан.
AbstractFactoryPatternDemo , наш демонстрационный класс использует FactoryProducer для получения объекта AbstractFactory . Он будет передавать информацию ( CIRCLE / RECTANGLE / SQUARE для Shape ) в AbstractFactory для получения нужного типа объекта. Он также передает информацию ( RED / GREEN / BLUE для Color ) в AbstractFactory для получения нужного типа объекта.
Шаг 1
Создайте интерфейс для форм и цветов.
Shape.java
public interface Shape { void draw(); }
Шаг 2
Создайте конкретные классы, реализующие тот же интерфейс.
RoundedRectangle.java
public class RoundedRectangle implements Shape { @Override public void draw() { System.out.println("Inside RoundedRectangle::draw() method."); } }
RoundedSquare.java
public class RoundedSquare implements Shape { @Override public void draw() { System.out.println("Inside RoundedSquare::draw() method."); } }
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
Шаг 3
Создайте абстрактный класс, чтобы получить фабрики для объектов нормальной и округлой формы.
AbstractFactory.java
public abstract class AbstractFactory { abstract Shape getShape(String shapeType) ; }
Шаг 4
Создать классы Factory, расширяющие AbstractFactory для генерации объекта конкретного класса на основе заданной информации.
ShapeFactory.java
public class ShapeFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); }else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }
RoundedShapeFactory.java
public class RoundedShapeFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new RoundedRectangle(); }else if(shapeType.equalsIgnoreCase("SQUARE")){ return new RoundedSquare(); } return null; } }
Шаг 5
Создайте класс генератора / производителя фабрики, чтобы получить фабрики, передавая информацию, такую как форма
FactoryProducer.java
public class FactoryProducer { public static AbstractFactory getFactory(boolean rounded){ if(rounded){ return new RoundedShapeFactory(); }else{ return new ShapeFactory(); } } }
Шаг 6
Используйте FactoryProducer для получения AbstractFactory, чтобы получить фабрики конкретных классов, передавая информацию, такую как тип.
AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo { public static void main(String[] args) { //get rounded shape factory AbstractFactory shapeFactory = FactoryProducer.getFactory(false); //get an object of Shape Rounded Rectangle Shape shape1 = shapeFactory.getShape("RECTANGLE"); //call draw method of Shape Rectangle shape1.draw(); //get an object of Shape Rounded Square Shape shape2 = shapeFactory.getShape("SQUARE"); //call draw method of Shape Square shape2.draw(); //get rounded shape factory AbstractFactory shapeFactory1 = FactoryProducer.getFactory(true); //get an object of Shape Rectangle Shape shape3 = shapeFactory1.getShape("RECTANGLE"); //call draw method of Shape Rectangle shape3.draw(); //get an object of Shape Square Shape shape4 = shapeFactory1.getShape("SQUARE"); //call draw method of Shape Square shape4.draw(); } }
Шаг 7
Проверьте вывод.