Flyweight(享元模式)
運用共享技術(shù)有效地支持大量細粒度的對象觉壶。
比如iOS的RunTime就是享元的一個事件。每個對象調(diào)用的方法其實是他對應(yīng)的類里面實現(xiàn)的置吓。比如NSObject定義了很多方法讓所有對象都可以使用沦补。類對象永遠只有一個,而對應(yīng)的實例對象有無數(shù)個蚊逢。
VC.m
//享元工廠,里面包括多個共享的對象箫章。
HCDWebSiteFactory *facoty = [[HCDWebSiteFactory alloc]init];
//雖然生成了兩個fx和fy產(chǎn)品展示類型的對象烙荷,但是通過共享只初始化了一個產(chǎn)品展示的對象。
HCDWebSite fx = [facoty getWebSiteCategory:@"產(chǎn)品展示"];
HCDUser *user = [[HCDUser alloc]init];
user.name = @"張三";
[fx use:user];
HCDWebSite fy = [facoty getWebSiteCategory:@"產(chǎn)品展示"];
HCDUser *user1 = [[HCDUser alloc]init];
user1.name = @"李四";
[fy use:user1];
//初始化一個博客類型的對象檬寂。以后使用都可以共享使用终抽,因為他們有基本相似的功能。
HCDWebSite fz = [facoty getWebSiteCategory:@"博客"];
HCDUser *user2 = [[HCDUser alloc]init];
user2.name = @"王五";
[fz use:user2];
HCDWebSiteFactory.h
@interface HCDWebSiteFactory : NSObject
@property(nonatomic,strong)NSDictionary *flyweights;
-(id<HCDWebSite> )getWebSiteCategory:(NSString *)webkey;
-(NSInteger)getWebSiteCount;
@end
HCDWebSiteFactory.m
@implementation HCDWebSiteFactory
-(instancetype)init{
self = [super init];
if (self) {
_flyweights = [NSDictionary dictionary];
}
return self;
}
-(HCDWebSite)getWebSiteCategory:(NSString *)webkey{
__block HCDWebSite webset = nil;
[self.flyweights enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if (webkey == key) {
webset = obj;
*stop = YES;
}
}];
if (webset == nil) {
HCDConcreteWebSite *concreteset = [[HCDConcreteWebSite alloc] init];
concreteset.webName = webkey;
webset = concreteset;
NSMutableDictionary *mutabledic = [NSMutableDictionary dictionaryWithDictionary:self.flyweights];
[mutabledic setObject:webset forKey:webkey];
self.flyweights = [NSDictionary dictionaryWithDictionary:mutabledic];
}
return webset;
}
-(NSInteger)getWebSiteCount{
return self.flyweights.count;
}
@end