Flyweight Pattern简单随笔
????? ?
?享元模式: 以共享的方式高效地支持大量的細粒度對象。
?享元對象的狀態(tài):
?
? 1:內(nèi)蘊狀態(tài)(Internal State)內(nèi)蘊狀態(tài)存儲在享元對象內(nèi)部且不會隨環(huán)境改變而改變。因此內(nèi)蘊狀態(tài)并可以共享。
? 2:外蘊狀態(tài)(External State)。外蘊狀態(tài)是隨環(huán)境改變而改變的、不可以共享的狀態(tài)。享元對象的外蘊狀態(tài)必須由客戶端保存,并在享元對象被創(chuàng)建之后,在需要使用的時候再傳入到享元對象內(nèi)部。外蘊狀態(tài)與內(nèi)蘊狀態(tài)是相互獨立的。
? 享元模式的應用條件:
? 1: 一個系統(tǒng)有大量的對象。
? 2:這些對象耗費大量的內(nèi)存。
? 3:這些對象的狀態(tài)中的大部分都可以外部化。
? 4:這些對象可以按照內(nèi)蘊狀態(tài)分成很多的組,當把外蘊對象從對象中剔除時,每一個組都可以僅用一個對象代替。
? 5:軟件系統(tǒng)不依賴于這些對象的身份,換言之,這些對象可以是不可分辨的。
? .NET的享元模式:
?
? .NET中的String類型就是運用了享元模式。.NET中如果第一次創(chuàng)建了一個字符串對象s1,下次再創(chuàng)建相同的字符串s2時只是把它的引用指向s1所引用的具體對象,這就實現(xiàn)了相同字符串在內(nèi)存中的共享。
??
?? 在某些情況下,對象的數(shù)量可能會太多,從而導致了運行時的代價。那么我們?nèi)绾稳ケ苊獯罅考毩6鹊膶ο?#xff0c;同時又不影響客戶程序使用面向?qū)ο蟮姆绞竭M行操作,運用共享技術有效地支持大量細粒度的對象。
?
私有屬性是元素特有的,可以通過傳遞參數(shù)來進行賦值,而公共屬性則通過繼承來賦予相應的值:
?
?1?using?System;?2?using?System.Collections.Generic;
?3?using?System.Text;
?4?
?5?namespace?FlyWeightPatternSam
?6?{
?7?????public?abstract?class?Employer
?8?????{
?9?????????protected?string?_company?=?"COMPANY";//公共屬性
10?????????protected?string?_companyAddress?=?"ADDRESS";//公共屬性
11?
12?????????public?abstract?void?SetPropertity(string?name,string?age);
13?????????public?abstract?void?ShowInformation();
14?
15?????}
16?}
17?
18?using?System;
19?using?System.Collections.Generic;
20?using?System.Text;
21?
22?namespace?FlyWeightPatternSam
23?{
24?????public?class?EmployerA:Employer?
25?????{
26?????????private?string?_name;//特有屬性
27?????????private?string?_age;
28?????????private?string?_id="01";
29?????????public?override?void?SetPropertity(?string?name,?string?age)
30?????????{//傳遞相應的參數(shù)來賦值
31?????????????//throw?new?Exception("The?method?or?operation?is?not?implemented.");
32?????????????this._age?=?age;
33????????????
34?????????????this._name?=?name;
35?????????}
36?
37?????????public?override?void?ShowInformation()
38?????????{
39?????????????//throw?new?Exception("The?method?or?operation?is?not?implemented.");
40?????????????Console.WriteLine(_company?+"??"+_companyAddress?+"??"+_name?+"??"+_id?+"???"+_age?);
41?????????}
42?????}
43?}
44?
?
?
主要的是通過工廠來進行對象創(chuàng)建,當存在該對象時就取出該對象,否則拋出異常。同時,對工廠使用單件模式控制唯一性;
?
?1?using?System;?2?using?System.Collections.Generic;
?3?using?System.Text;
?4?
?5?namespace?FlyWeightPatternSam
?6?{
?7?????public?class?FlyweightFactory
?8?????{
?9?????????private?static?readonly?FlyweightFactory?instance=new?FlyweightFactory();
10?????????System.Collections.Generic.Dictionary<string,?Employer>?dictionary?=?new?Dictionary<string,?Employer>();
11?
12?????????private?FlyweightFactory()?
13?????????{
14?????????????dictionary.Add("01",new?EmployerA());
15?????????????dictionary.Add("02",new?EmployerB());
16?????????????dictionary.Add("03",new?EmployerC());
17?????????}
18?????????
19?????????public?static??FlyweightFactory?Instance
20?????????{
21?????????????get
22?????????????{
23?????????????????return?instance;
24?????????????}
25?????????}
26?
27?????????public?Employer?GetEmployer(string?str)?
28?????????{
29?????????????Employer?employer?=?null?;
30?????????????try
31?????????????{
32?????????????????employer?=?dictionary[str]?as?Employer;????
33?????????????}
34?????????????catch(Exception?ex)
35?????????????{
36?????????????????Console.WriteLine(ex.Message);
37?????????????}
38?????????????return?employer;
39?????????}
40?????}
41?}
42?
?
?
客戶端代碼如下所示:
?
代碼 using?System;using?System.Collections.Generic;
using?System.Text;
namespace?FlyWeightPatternSam
{
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????Employer?employer?=?FlyweightFactory.Instance.GetEmployer("01");
????????????employer.SetPropertity("jasen","24");
????????????employer.ShowInformation();
????????????Console.ReadLine();
????????????
????????????employer?=?FlyweightFactory.Instance.GetEmployer("04");
????????????Console.ReadLine();
????????????
????????????employer?=?FlyweightFactory.Instance.GetEmployer("01");
????????????employer.SetPropertity("jasen",?"25");
????????????employer.ShowInformation();
????????????Console.ReadLine();
????????}
????}
}
?
?
操作結(jié)果如下:
?
**************************************************************************
源代碼下載:/Files/jasenkin/FlyWeightPatternSam.rar
?
轉(zhuǎn)載于:https://www.cnblogs.com/jasenkin/archive/2010/03/17/1688249.html
總結(jié)
以上是生活随笔為你收集整理的Flyweight Pattern简单随笔的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server:移动系统数据库
- 下一篇: Android高效编程注意事项