Wzorzec projektowy - abstrakcyjny wzór fabryczny
Wzory abstrakcyjnej fabryki działają wokół superfabryki, która tworzy inne fabryki. Ta fabryka jest również nazywana fabryką fabryk. Ten typ wzorca projektowego wchodzi w zakres wzorca kreacyjnego, ponieważ ten wzorzec zapewnia jeden z najlepszych sposobów tworzenia obiektu.
We wzorcu Abstract Factory interfejs jest odpowiedzialny za tworzenie fabryki powiązanych obiektów bez jawnego określania ich klas. Każda wygenerowana fabryka może nadać obiekty zgodnie ze wzorcem fabryki.
Realizacja
Mamy zamiar stworzyć interfejs Shape i konkretną klasę implementującą go. Jako kolejny krok tworzymy abstrakcyjną klasę fabryczną AbstractFactory. Zdefiniowano klasę fabryki ShapeFactory, która jest rozszerzeniem klasy AbstractFactory. Tworzona jest klasa FactoryProducer tworząca / generująca fabrykę.
AbstractFactoryPatternDemo, nasza klasa demonstracyjna używa FactoryProducer, aby uzyskać obiekt AbstractFactory. Przekaże informacje (CIRCLE / RECTANGLE / SQUARE dla Shape) do AbstractFactory, aby uzyskać typ obiektu, którego potrzebuje.
Krok 1
Utwórz interfejs dla kształtów.
Shape.java
public interface Shape {
void draw();
}
Krok 2
Utwórz konkretne klasy implementujące ten sam interfejs.
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.");
}
}
Krok 3
Utwórz klasę abstrakcyjną, aby uzyskać fabryki dla obiektów o normalnym i zaokrąglonym kształcie.
AbstractFactory.java
public abstract class AbstractFactory {
abstract Shape getShape(String shapeType) ;
}
Krok 4
Utwórz klasy Factory rozszerzające AbstractFactory w celu wygenerowania obiektu konkretnej klasy na podstawie podanych informacji.
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;
}
}
Krok 5
Utwórz klasę generatora / producenta fabryki, aby uzyskać fabryki, przekazując informacje, takie jak Shape
FactoryProducer.java
public class FactoryProducer {
public static AbstractFactory getFactory(boolean rounded){
if(rounded){
return new RoundedShapeFactory();
}else{
return new ShapeFactory();
}
}
}
Krok 6
Użyj FactoryProducer, aby uzyskać AbstractFactory w celu uzyskania fabryk konkretnych klas, przekazując informacje, takie jak typ.
AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
//get shape factory
AbstractFactory shapeFactory = FactoryProducer.getFactory(false);
//get an object of Shape Rectangle
Shape shape1 = shapeFactory.getShape("RECTANGLE");
//call draw method of Shape Rectangle
shape1.draw();
//get an object of Shape Square
Shape shape2 = shapeFactory.getShape("SQUARE");
//call draw method of Shape Square
shape2.draw();
//get 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();
}
}
Krok 7
Sprawdź dane wyjściowe.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside RoundedRectangle::draw() method.
Inside RoundedSquare::draw() method.