iOS架构师_享元模式

享元模式定义:相同的数据就拿来共享
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);
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值