享元模式:運用共享技術有效地支援大量細粒度的物件。
比如做乙個網頁,但是會有不同的用途,有時是展示產品,有時展示部落格。實際開發中,如果每次都建立乙個新的物件,開銷很大,所以我們用乙個集合將物件存起來,後面有用到相同物件的直接從集合中取出,這就是享元模式的思想。
舉個例子:
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.可以節省重複建立物件的開銷,因為被享元模...