2016-11-04 2 views
3

ich einige Code sah definiert das Urmuster auf diese Weise:was der Nutzen der Urmuster in diesem Fall ist

public abstract class Shape implements Cloneable { 

    private String id; 
    protected String type; 

    abstract void draw(); 

    public String getType(){ 
     return type; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public Object clone() { 
     Object clone = null; 

     try { 
     clone = super.clone(); 

     } catch (CloneNotSupportedException e) { 
     e.printStackTrace(); 
     } 

     return clone; 
    } 
} 

Zwei konkrete Klassen die oben Klasse erweitert:

public class Rectangle extends Shape { 

    public Rectangle(){ 
    type = "Rectangle"; 
    } 

    @Override 
    public void draw() { 
     System.out.println("Inside Rectangle::draw() method."); 
    } 
} 
public class Square extends Shape { 

    public Square(){ 
    type = "Square"; 
    } 

    @Override 
    public void draw() { 
     System.out.println("Inside Square::draw() method."); 
    } 
} 

Erstellen Sie eine Klasse um konkrete Klassen aus der Datenbank zu bekommen und sie in einer Hashtable zu speichern:

public class ShapeCache { 

    private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>(); 

    public static Shape getShape(String shapeId) { 
     Shape cachedShape = shapeMap.get(shapeId); 
     return (Shape) cachedShape.clone(); 
    } 


    public static void loadCache() { 

     Square square = new Square(); 
     square.setId("2"); 
     shapeMap.put(square.getId(),square); 

     Rectangle rectangle = new Rectangle(); 
     rectangle.setId("3"); 
     shapeMap.put(rectangle.getId(), rectangle); 
    } 
} 

Meine Frage ist in der getShape m ethode was ist der Unterschied und Nutzen zwischen diesen beiden Implementierungen:

Implementierung 1:

public static Shape getShape(String shapeId) { 
     Shape cachedShape = shapeMap.get(shapeId); 
     return (Shape) cachedShape.clone(); 
    } 

Und: Implementierung 2:

public static Shape getShape(String shapeId) { 
     Shape cachedShape = shapeMap.get(shapeId); 
     // return (Shape) cachedShape.clone(); 
    return cachedShape ; 
    } 

Ich habe versucht, die beiden Implementierungen und sie funktionieren gut nur ich möchte den Nutzen wissen, wenn ich die erste Implementierung

verwende

Antwort

3

Ich habe eine gehörige Zeit verstehen, wie alle Ihre Eingabe tatsächlich auf die letzte Frage in Ihrem Text bezieht, aber wir versuchen: Der grundlegende Unterschied ist: Option 1 erstellt eine Kopie des zwischengespeicherten Objekts jedes Mal.

Während sich die Option 2 ... gibt Ihnen die im Cache gespeicherte Objekt selbst.

Wie Sie einen Cache sprechen über und eine Getter Methode, der eigentliche Code mit Option gefunden wird 1 überraschend gelinde gesagt.

Mit anderen Worten: Die meisten Menschen würden erwarten, dass ein Cache ist die gleichen Objekte seines Benutzer über die Bereitstellung (das ist der ganze Punkt einen Cache!).

Also, meine nehmen hier: es scheint, dass Klonen ist wichtig für Ihr Design. Wenn ja, dann sollten Sie Ihre Vorstellung, dort einen Cache zu haben, überdenken. Ist dieser Cache mehr wie eine "Vorlagen-Engine", die "Muster" enthält und Ihnen erlaubt, diese "Muster" zu duplizieren? Aber am Ende ist der entscheidende Faktor hier nicht, was wir denken, sondern was am meisten Sinn macht in Ihrer Domain. Und damit können wir nicht helfen.

Lange Rede, kurzer Sinn: die Klassen und die Funktionalitäten, die man in sie steckt ... gibt es nicht in irgendeinem Vakuum.Sie erstellen sie, um ein "mentales Modell" zu implementieren, das existiert, um ein Problem zu lösen. Und Sie sind die Person, die das Problem, das Sie lösen wollen, verstehen sollte. Und das treibt Ihre Implementierung an. Und wie gesagt; Wir können nicht mit den genauen Details davon helfen.

+0

Ich mochte eigentlich, dass Sie erklärt;) – Jay

+0

Ich bin nicht das OP: P – Jay

3

Implementierung 1 gibt ein neues Objekt zurück. Wenn Sie dieses Objekt ändern, wird das Objekt in Ihrer shapeMap nicht geändert.

Implementierung 2 geben Sie das genaue Objekt in Ihrer shapeMap zurück. Wenn Sie das ändern, wird das Objekt in Ihrer ShapeMap geändert.

Es hängt also alles davon ab, was genau Sie mit dem Ergebnis Ihrer Methode machen möchten.

+0

Vielen Dank, ich verstehe jetzt den Unterschied zwischen den beiden Optionen –

Verwandte Themen