享元模式定义:相同的数据就拿来共享
1、可共享享元对象
2、享元池
减少同一类对象的大量创建,减少节约了内存空间。
使用范围:服务器端:查询火车票(共享对象)
iOS端:多线程(线程池),UITableViewCell,UICollectionViewCell
UML结构图
代码示例
创建工厂FlowerFactory类,并且创建类Flower
Flower.h
#import <Foundation/Foundation.h>
@interface Flower : NSObject
@property (nonatomic, copy) NSString *flowerColor; // 花色
@property (nonatomic, copy) NSString *flowerName; // 花名
@end
FlowerFactory.h
#import <Foundation/Foundation.h>
#import "Flower.h"
typedef enum {
kRedFlower, // 0
kBlueFlower, // 1
kYellowFlower, // 2
kTotalNumberFlower // 用于计数的.
}FlowerType;
@interface FlowerFactory : NSObject
// 缓存池, 存放享元对象
@property (nonatomic, strong) NSMutableDictionary *flowerPools;
// 创建花的工厂方法
- (Flower *)flowerViewWithType:(FlowerType)type;
- (void)detailsType;
@end
FlowerFactory.m
#import "FlowerFactory.h"
@implementation FlowerFactory
- (Flower *)flowerViewWithType:(FlowerType)type {
// 1. 懒加载flowerPools, 初始化享元池.
if (self.flowerPools == nil) {
self.flowerPools = [[NSMutableDictionary alloc] initWithCapacity:kTotalNumberFlower];
}
// 2. 去享元池里面取
Flower *flower = [self.flowerPools objectForKey:[NSNumber numberWithInteger:type]];
// 3. 如果没取到就判断
if (flower == nil) {
// 1. 创建花
flower = [[Flower alloc] init];
// 2. 根据传进来的类型, 去选择对应的类型
switch (type) {
case kRedFlower:
flower.flowerColor = @"红色的花";
flower.flowerName = @"红玫瑰";
break;
case kBlueFlower:
flower.flowerColor = @"蓝色的花";
flower.flowerName = @"蓝玫瑰";
break;
case kYellowFlower:
flower.flowerColor = @"黄色的花";
flower.flowerName = @"野菊花";
break;
default:
break;
}
// 3. 把创建的话,添加到享元池里面
[self.flowerPools setObject:flower forKey:[NSNumber numberWithInt:type]];
}
return flower;
}
- (void)detailsType {
NSArray *array = [self.flowerPools allKeys];
// 打印
for (NSNumber *key in array) {
NSLog(@"di zhi = %@, key = %@", self.flowerPools[key], key);
}
}
@end
ViewController.h调用
#import "ViewController.h"
#import "FlowerFactory.h"
#import "Flower.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化工厂
FlowerFactory *factory = [[FlowerFactory alloc] init];
NSMutableArray *arrayFlowers = [[NSMutableArray alloc] init];
// for循环调用
for (int i = 0; i < 5000*100; ++i) {
FlowerType flowerType = arc4random_uniform(kTotalNumberFlower);
// 使用缓存池工厂方法来调用.类型是随机的
Flower *flower = [factory flowerViewWithType:flowerType];
// 简单的创建方式
// Flower *flower = [[Flower alloc] init];
[arrayFlowers addObject:flower];
// 打印详情
[factory detailsType];
}
}
@end
此时我们查看内存
然后修改代码,使用常规方式创建对象
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 初始化工厂
FlowerFactory *factory = [[FlowerFactory alloc] init];
NSMutableArray *arrayFlowers = [[NSMutableArray alloc] init];
// for循环调用
for (int i = 0; i < 5000*100; ++i) {
FlowerType flowerType = arc4random_uniform(kTotalNumberFlower);
// 使用缓存池工厂方法来调用.类型是随机的
// Flower *flower = [factory flowerViewWithType:flowerType];
//使用常规方法创建
Flower * flower = [[Flower alloc]init];
[arrayFlowers addObject:flower];
// 打印详情
// [factory detailsType];
}
NSLog(@"flower== %lu",arrayFlowers.count);
}