ios-享元模式

344 阅读2分钟
  • 结构型模式关注类和对象之间的组合
  • 主要用于减少创建对象的数量,以减少内存占用和提高性能
  • 内部状态:
    • 在享元对象内部并且不会随着环境改变而改变的共享部分。
  • 外部状态:
    • 随环境改变而改变,不可以共享的状态
  • 意图:
    • 运用共享技术有效的支持大量细粒度的对象
  • 应用场景:
    • 1.系统有大量的相似对象
    • 2.需要缓冲池的场景
  • 优点:
    • 大大减少对象的创建,降低系统的内存,使效率提高
  • 缺点:
    • 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不能随着内部状态改变而改变,否则会造成系统的混乱。
  • 注意:
    • 1.注意划分外部状态和内部状态,否则可能会引起线程安全问题。
    • 2.这些类必须有一个工厂对象加以控制。
  • 最常见的就是单元格的重用。
  • 定义一个用户类
#import <Foundation/Foundation.h>

@interface HCDUser : NSObject
@property(nonatomic,strong)NSString *name;
@end


#import "HCDUser.h"

@implementation HCDUser

@end
  • 定义一个协议
#import <Foundation/Foundation.h>
#import "HCDUser.h"
@protocol HCDWebSite <NSObject>
-(void)use:(HCDUser *)user;
@end

  • 定义一个网站类
#import <Foundation/Foundation.h>
#import "HCDWebSite.h"
@interface HCDConcreteWebSite : NSObject<HCDWebSite>
@property(nonatomic,strong)NSString *webName;
@end

#import "HCDConcreteWebSite.h"

@implementation HCDConcreteWebSite
-(void)use:(HCDUser *)user{
    NSLog(@"网站分类:%@,用户:%@",self.webName,user.name);
}
@end

  • 定义一个工厂类用于控制
#import <Foundation/Foundation.h>
#import "HCDWebSite.h"


@interface HCDWebSiteFactory : NSObject
@property(nonatomic,strong)NSDictionary *flyweights;

-(id<HCDWebSite> )getWebSiteCategory:(NSString *)webkey;
-(NSInteger)getWebSiteCount;
@end


#import "HCDWebSiteFactory.h"
#import "HCDConcreteWebSite.h"
@implementation HCDWebSiteFactory

-(instancetype)init{
    self = [super init];
    if (self) {
        _flyweights = [NSDictionary dictionary];
    }
    return self;
}

-(id<HCDWebSite> )getWebSiteCategory:(NSString *)webkey{
    __block id<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

  • 调用
#import "ViewController.h"
#import "HCDWebSiteFactory.h"
#import "HCDWebSite.h"
#import "HCDConcreteWebSite.h"
#import "HCDUser.h"

typedef id<HCDWebSite> HCDWebSiteType;
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    HCDWebSiteFactory *facoty = [[HCDWebSiteFactory alloc]init];
    HCDWebSiteType fx = [facoty getWebSiteCategory:@"产品展示"];
    HCDUser *user = [[HCDUser alloc]init];
    user.name = @"小菜";
    [fx use:user];
    HCDWebSiteType fy = [facoty getWebSiteCategory:@"产品展示"];
    HCDUser *user1 = [[HCDUser alloc]init];
    user1.name = @"大鸟";
    [fy use:user1];
    HCDWebSiteType fz = [facoty getWebSiteCategory:@"博客"];
    HCDUser *user2 = [[HCDUser alloc]init];
    user2.name = @"咪咪";
    [fz use:user2];
    
    NSInteger count = [facoty getWebSiteCount];
    NSLog(@"个数:%d",count);
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

image.png

  • 结果虽然是三个人但是真正创建的对象网站只有2个供3个人使用。 image.png