享元模式(二十)

2021-09-25 14:08:36 字數 1930 閱讀 2191

享元模式:運用共享技術有效地支援大量細粒度的物件。

比如做乙個網頁,但是會有不同的用途,有時是展示產品,有時展示部落格。實際開發中,如果每次都建立乙個新的物件,開銷很大,所以我們用乙個集合將物件存起來,後面有用到相同物件的直接從集合中取出,這就是享元模式的思想。

舉個例子:

public abstract class website
concretewebsite:繼承享元超類,或實現介面,並為內部狀態增加儲存空間:

public class concretewebsite extends website 

@override

public void use()

}

websitefactory:乙個享元工廠,用來建立並管理website(享元物件)。他主要是用來確保合理地共享website,當使用者請求乙個website時,websitefactory物件提供乙個已建立的例項或者建立乙個(如果不存在的話)。

public class websitefactory 

return flyweights.get(key);

}public int getwebsitecount()

}

測試**:

public class flyweighttest 

}

輸出:

這樣寫基本上實現了享元模式的共享物件的目的,也就是說不管建幾個**,只要是「產品展示」都是一樣的,「部落格」也是相同的,但這存在乙個問題,因為**的資料不同,所以至少他們都有不同的賬號,所以還要實現它們不共享的部分。

在享元物件內部並且不會隨環境改變而改變的共享部分,可以稱為是享元物件的內部狀態,而隨環境改變而改變的,不可以共享的狀態就是外部狀態了。事實上,享元模式可以避免大量非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果能發現這些類例項除了幾個引數外基本上都是相同的,有時能夠大幅的減少例項化類的數量。如果能把那些引數移到類例項的外面,在方法呼叫時將他們傳遞進來,就可以通過共享大幅地減少單個例項的數目。

在上面的例子中,客戶賬號就是外部狀態,應該由專門的物件來處理。

改進後的**:

新增使用者類:

public class user 

public string getname()

}

抽象類傳入使用者類:

public abstract class website
public class concretewebsite extends website 

@override

public void use(user user)

}

工廠類不變,測試**如下:

public class flyweighttest 

}

輸出:

**分類:產品展示 使用者:user1

**分類:產品展示 使用者:user2

**分類:產品展示 使用者:user3

**分類:部落格 使用者:user4

**分類:部落格 使用者:user5

**分類:部落格 使用者:user6

**個數為:2

如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時就應該考慮使用;還有就是物件的大多數狀態可以外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時可以考慮使用享元模式。

因為用了享元模式,所以有了共享物件,例項總數就大大減少了,如果共享的物件越多,儲存節約也就越多,節約量隨著共享狀態的增多而增大。

二十八 享元模式

享元模式 flyweight 運用共享技術有效地支援大量細粒度的物件 注意 如果乙個應用程式使用了大量的物件,而大量的這些物件造成很大的儲存開銷時就要考慮使用 物件的大多數狀態可以外部狀態,如果刪除物件的外部狀態,那麼可以使用相對較少的共享物件取代很多組物件,此時可以考慮使用。實際上在.net中,字...

設計模式C 實現二十二 享元模式

享元模式 flyweight 運用共享技術有效地支援大量細粒度的物件。享元模式可以避免大量非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果能發現這些例項除了幾個引數外基本上都是相同的,有時就能夠受大幅度地減少需要例項化的類的數量。如果能把那些引數移到類例項的外面,在方法...

設計模式(享元模式)

享元模式是設計模式中少數幾個已提高系統效能為目的模式之一。它的核心思想是 如果系統存在多個 相同的物件,那麼只需要共享一分物件的拷貝,而不必為每一次使用都建立新的物件。當有物件被大量復用時,特別是重量級的物件復用可以使用享元模式來提高系統效能。其優點如下 1.可以節省重複建立物件的開銷,因為被享元模...