2016-11-04 121 views
3

我看到一些代碼的好處定義這樣的原型模式:什麼是原型模式在這種情況下

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; 
    } 
} 

兩個具體的類擴展上述類:

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."); 
    } 
} 

創建一個類從數據庫中獲得具體的類並將它們存儲在Hashtable中:

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); 
    } 
} 

我的問題是在getShape m ethod的是這兩種實現之間的區別和好處:我嘗試了兩種實現方式,他們

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

實現1:

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

和: 實施2工作得很好,只是我想知道如果我使用第一個實施方案的好處

回答

3

我有一段時間瞭解如何將所有輸入實際上與您放入文本中的最終問題聯繫起來,但讓我們嘗試一下:最根本的區別是:選項1每次創建緩存對象的副本

鑑於選項2 ...給你緩存的對象本身

當你談論一個緩存吸氣方法,與選項1中找到實際的代碼是奇怪至少可以這樣說。

換句話說,大多數人會想到,一個緩存是關於提供相同對象給它的用戶(即緩存的整個!)。

所以,我在這裏:似乎克隆對您的設計很重要。如果是這樣,那麼你應該重新考慮你在那裏擁有緩存的想法。該緩存更像是一個包含「模式」的「模板引擎」,並允許您複製這些「模式」?但最終,這裏的指導因素不是我們的想法,而是在您的中最有意義。這是我們無法提供的幫助。

長話短說:你放入他們的課程和功能......並不存在於某種真空中。你創建它們來實現一個存在的「心理模型」來解決問題。而你是應該理解你打算解決的問題的人。這推動了你的實現。如前所述;我們無法幫助確切的細節。

+0

我其實很喜歡你解釋;) – Jay

+0

我不是OP:P – Jay

3

實現1返回一個新的對象。更改該對象不會更改shapeMap中的對象。

實現2返回shapeMap中的確切對象。如果你改變它,shapeMap中的對象將被改變。

所以這一切都取決於你想要做什麼你的方法的結果。

+0

謝謝我現在明白了兩個選項之間的區別 –

相關問題