Entwurfsmuster - Abstraktes Fabrikmuster
Abstrakte Fabrikmuster arbeiten um eine Superfabrik herum, die andere Fabriken schafft. Diese Fabrik wird auch als Fabrik der Fabriken bezeichnet. Diese Art von Entwurfsmuster fällt unter das Erstellungsmuster, da dieses Muster eine der besten Möglichkeiten zum Erstellen eines Objekts bietet.
Im Abstract Factory-Muster ist eine Schnittstelle dafür verantwortlich, eine Factory verwandter Objekte zu erstellen, ohne deren Klassen explizit anzugeben. Jede generierte Factory kann die Objekte gemäß dem Factory-Muster angeben.
Implementierung
Wir werden eine Shape-Schnittstelle erstellen und eine konkrete Klasse implementieren. Als nächsten Schritt erstellen wir eine abstrakte Factory-Klasse AbstractFactory. Es ist die Factory-Klasse ShapeFactory definiert, die AbstractFactory erweitert. Eine Factory Creator / Generator-Klasse FactoryProducer wird erstellt.
AbstractFactoryPatternDemo, unsere Demo-Klasse, verwendet FactoryProducer, um ein AbstractFactory-Objekt abzurufen. Es werden Informationen (CIRCLE / RECTANGLE / SQUARE for Shape) an AbstractFactory übergeben, um den gewünschten Objekttyp zu erhalten.
Schritt 1
Erstellen Sie eine Schnittstelle für Formen.
Shape.java
public interface Shape {
void draw();
}
Schritt 2
Erstellen Sie konkrete Klassen, die dieselbe Schnittstelle implementieren.
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.");
}
}
Schritt 3
Erstellen Sie eine abstrakte Klasse, um Fabriken für Objekte mit normaler und abgerundeter Form abzurufen.
AbstractFactory.java
public abstract class AbstractFactory {
abstract Shape getShape(String shapeType) ;
}
Schritt 4
Erstellen Sie Factory-Klassen, die AbstractFactory erweitern, um basierend auf den angegebenen Informationen ein Objekt einer konkreten Klasse zu generieren.
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;
}
}
Schritt 5
Erstellen Sie eine Factory-Generator- / Produzentenklasse, um Fabriken zu erhalten, indem Sie Informationen wie Shape übergeben
FactoryProducer.java
public class FactoryProducer {
public static AbstractFactory getFactory(boolean rounded){
if(rounded){
return new RoundedShapeFactory();
}else{
return new ShapeFactory();
}
}
}
Schritt 6
Verwenden Sie den FactoryProducer, um AbstractFactory abzurufen und Fabriken konkreter Klassen durch Übergabe von Informationen wie type abzurufen.
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();
}
}
Schritt 7
Überprüfen Sie die Ausgabe.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside RoundedRectangle::draw() method.
Inside RoundedSquare::draw() method.