2016-10-02 27 views
0

要應用flyweight模式,我們需要將Object屬性分爲內在屬性和外部屬性。固有屬性使對象唯一,而外部屬性由客戶端代碼設置並用於執行不同的操作。我沒有看到任何flyweight模式的使用。它真的有用嗎?

但我的問題是爲什麼我們不能同時擁有內部屬性和外部屬性作爲實例變量(請參見下面的Email類),只需在循環外部創建一個對象並在循環中設置參數併發送多個具有不同參數的電子郵件。

public class Test { 
    public static void main(String[] args) { 
     Email ob = new Email(); 
     for (int i = 0; i < 10; i++) { 
      ob.sender = String.valueOf(i); 
      ob.sendEmail(); 
     } 
    } 
} 

public class Email { 
    public String sender; 
    public void sendEmail() 
    { 
     System.out.println("Email sent to sender:"+sender); 
    } 
} 
+0

確實Flyweight不是一種模式,它是一種在Java中節省內存的解決方案。它與oops –

+0

@SweetWithrathne無關,flyweight是一個模式,來自規範設計模式書,可重用面向對象軟件_的元素_。說它不是一種模式,與OOP無關是完全無稽之談;並且該模式並不特定於Java。 GoF OOP模式是語言不可知的。 – jaco0646

+0

@ jaco0646不是Java特定的:yh,我會同意這個說明。但它絕對與面向對象無關。你爲什麼這麼說是廢話?那麼它與OO有什麼關係?考慮到軟件的結構方面,設計模式就是一個解決問題的方法。如果flyweight是一個模式,如果有人說'merge-sort'是一個模式,我不會看錯。想看看你的想法。 :)) –

回答

3

有時,模式並不明顯,但並不意味着它們沒用。我擔心你錯誤地理解了flyweight模式。

其主要思想是通過共享之前已經使用過的相同對象來減少內存使用。通常情況下,內部有一個數據結構,負責保存值並按照某些標準返回它們。它查找已經存在的元素,而不是創建一個新元素。

其實它很有用。例如,JDK使用此模式提供Integer緩存(保留一小部分值以有效返回)和String緩衝池(查看intern()方法)。

+0

有時候我看到人們強迫使用一種模式。 –

+0

@NikolasCharalambidis ......在不需要的情況下 – Andrew

0

Flyweight告訴的是'應如何處理不可變對象的方式'

  • 如果某些類型的對象是不可變的(我一般喜歡所有對象是不可變的儘可能)
  • 你有那種在應用程序中創建的對象,具有一定的屬性集,防爆:一個不變Person對象與name = "John", age = 20
  • 創建,你有另一個對象完全一樣的應用excecution一段時間(name = "John", age = 20)後,
  • 只需使用以前創建,無需創建另一個(無需擔心,因爲它是immutable,屬性不會在那裏改變)

所以它基本上是一個工作,以節省內存。它與面向對象無關。

相關問題