享元模式定义:相同的数据就拿来共享
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, // 0kBlueFlower, // 1kYellowFlower, // 2kTotalNumberFlower // 用于计数的.
}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",unt);
}
本文发布于:2024-01-29 02:38:20,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170646710512100.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |