Design Patterns - Fliegengewichtsmuster
Das Fliegengewichtsmuster wird hauptsächlich verwendet, um die Anzahl der erstellten Objekte zu verringern, den Speicherbedarf zu verringern und die Leistung zu steigern. Diese Art von Entwurfsmuster fällt unter ein Strukturmuster, da dieses Muster Möglichkeiten zum Verringern der Objektanzahl bietet, wodurch die Objektstruktur der Anwendung verbessert wird.
Das Flyweight-Muster versucht, bereits vorhandene Objekte ähnlicher Art durch Speichern wiederzuverwenden, und erstellt ein neues Objekt, wenn kein passendes Objekt gefunden wird. Wir werden dieses Muster demonstrieren, indem wir 20 Kreise an verschiedenen Orten zeichnen, aber wir werden nur 5 Objekte erstellen. Es sind nur 5 Farben verfügbar, sodass die Farbeigenschaft verwendet wird, um bereits vorhandene Kreisobjekte zu überprüfen .
Implementierung
Wir werden eine schaffen Form Schnittstelle und konkrete Klasse Kreis der Umsetzung der Form - Schnittstelle. Als nächster Schritt wird eine Factory-Klasse ShapeFactory definiert.
ShapeFactory verfügt über eine HashMap of Circle mit dem Schlüssel als Farbe des Circle- Objekts. Immer wenn eine Anforderung zum Erstellen eines Kreises mit einer bestimmten Farbe für ShapeFactory eingeht , überprüft sie das Kreisobjekt in ihrer HashMap . Wenn ein Objekt von Circle gefunden wird, wird dieses Objekt zurückgegeben, andernfalls wird ein neues Objekt erstellt, in der Hashmap für die zukünftige Verwendung gespeichert und an zurückgegeben Klient.
FlyWeightPatternDemo , unsere Demo-Klasse, verwendet ShapeFactory , um ein Shape- Objekt abzurufen . Es werden Informationen ( rot / grün / blau / schwarz / weiß ) an ShapeFactory übergeben , um den Kreis der gewünschten Farbe zu erhalten, den es benötigt.
Schritt 1
Erstellen Sie eine Schnittstelle.
Shape.java
public interface Shape {
void draw();
}
Schritt 2
Erstellen Sie eine konkrete Klasse, die dieselbe Schnittstelle implementiert.
Circle.java
public class Circle implements Shape {
private String color;
private int x;
private int y;
private int radius;
public Circle(String color){
this.color = color;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setRadius(int radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Circle: Draw() [Color : " + color + ", x : " + x + ", y :" + y + ", radius :" + radius);
}
}
Schritt 3
Erstellen Sie eine Factory, um basierend auf den angegebenen Informationen ein Objekt der konkreten Klasse zu generieren.
ShapeFactory.java
import java.util.HashMap;
public class ShapeFactory {
// Uncomment the compiler directive line and
// javac *.java will compile properly.
// @SuppressWarnings("unchecked")
private static final HashMap circleMap = new HashMap();
public static Shape getCircle(String color) {
Circle circle = (Circle)circleMap.get(color);
if(circle == null) {
circle = new Circle(color);
circleMap.put(color, circle);
System.out.println("Creating circle of color : " + color);
}
return circle;
}
}
Schritt 4
Verwenden Sie die Fabrik, um ein Objekt der konkreten Klasse zu erhalten, indem Sie Informationen wie Farbe übergeben.
FlyweightPatternDemo.java
public class FlyweightPatternDemo {
private static final String colors[] = { "Red", "Green", "Blue", "White", "Black" };
public static void main(String[] args) {
for(int i=0; i < 20; ++i) {
Circle circle = (Circle)ShapeFactory.getCircle(getRandomColor());
circle.setX(getRandomX());
circle.setY(getRandomY());
circle.setRadius(100);
circle.draw();
}
}
private static String getRandomColor() {
return colors[(int)(Math.random()*colors.length)];
}
private static int getRandomX() {
return (int)(Math.random()*100 );
}
private static int getRandomY() {
return (int)(Math.random()*100);
}
}
Schritt 5
Überprüfen Sie die Ausgabe.
Creating circle of color : Black
Circle: Draw() [Color : Black, x : 36, y :71, radius :100
Creating circle of color : Green
Circle: Draw() [Color : Green, x : 27, y :27, radius :100
Creating circle of color : White
Circle: Draw() [Color : White, x : 64, y :10, radius :100
Creating circle of color : Red
Circle: Draw() [Color : Red, x : 15, y :44, radius :100
Circle: Draw() [Color : Green, x : 19, y :10, radius :100
Circle: Draw() [Color : Green, x : 94, y :32, radius :100
Circle: Draw() [Color : White, x : 69, y :98, radius :100
Creating circle of color : Blue
Circle: Draw() [Color : Blue, x : 13, y :4, radius :100
Circle: Draw() [Color : Green, x : 21, y :21, radius :100
Circle: Draw() [Color : Blue, x : 55, y :86, radius :100
Circle: Draw() [Color : White, x : 90, y :70, radius :100
Circle: Draw() [Color : Green, x : 78, y :3, radius :100
Circle: Draw() [Color : Green, x : 64, y :89, radius :100
Circle: Draw() [Color : Blue, x : 3, y :91, radius :100
Circle: Draw() [Color : Blue, x : 62, y :82, radius :100
Circle: Draw() [Color : Green, x : 97, y :61, radius :100
Circle: Draw() [Color : Green, x : 86, y :12, radius :100
Circle: Draw() [Color : Green, x : 38, y :93, radius :100
Circle: Draw() [Color : Red, x : 76, y :82, radius :100
Circle: Draw() [Color : Blue, x : 95, y :82, radius :100