iOS 享元设计模式 (flyweight design model)

    定义:

    享元模式是 一种 可共享 对象的一种设计模式。在需要使用大量的细粒度 对象的过程中。这种模式 能很大的减少内存和提升性能。

    所谓 细粒度,就是对象相近 而且 数量很多。 我们把这些对象 分成 内部状态 和 外部状态。 内部状态 只使用一个对象来共享,外       部  。外部状态 不能共享出来,是对象区分的。

   大体实现:

  实现享元模式需要两个关键组件,通常是可共享的享元对象和保存他们的池。某种中央对象维护这个池,并从它返回适当的实例。

   在中 demo下载地址中:  https://github.com/LoveHouLinLi/ShareElement_DesginMode。  介绍了基本原理 WebSiteFactory 类:是管理池 和 获取共享对象的类  WebSiteFactory中 的 flyweights 就是存储 不同的

   共享对象的池。DLConcreteWebSite 类:创建共享对象的 类   User:代表代表了 共享的外部状态 这里使用 执行WebSiteProtocol 协议 使用。

             第一个基本定义分析:

    WebSiteFactory *factory = [[WebSiteFactoryalloc]init];

    

    webSiteType type1 = [factorygetWebSiteCategory:@"首页"];

    User *user1 = [[Useralloc]init];

    user1.userName = @"张三";

    [type1 use:user1];

    

    webSiteType type2 = [factorygetWebSiteCategory:@"iOS"];

    User *user2 = [[Useralloc]init];

    user2.userName = @"德龙";

    [type2 use:user2];


    

    webSiteType type3 = [factorygetWebSiteCategory:@"Java"];

    User *user3 = [[Useralloc]init];

    user3.userName = @"Developer";

    [type3 use:user3];

    

    NSInteger count = [factorygetWebSiteCount];

    NSLog(@"个数: %ld", (long)count); // 3

    

    

    webSiteType type4 = [factorygetWebSiteCategory:@"Java"];

    User *user4 = [[Useralloc]init];

    user4.userName =@"new Java Developer";

    [type4 use:user4];

    

    NSInteger count2 = [factorygetWebSiteCount];

    NSLog(@"个数: %ld", (long)count2); // 3


注意 type4  和  type3 实际上是同一个共享的元素。 外部的变量 User 可以是不同的。这样 就不要重复的创建。


    二: 我们DEMO中 在屏幕中随机显示花朵图案,屏幕中填满花朵“百花池”。但是实际上只使用了6个不同的花朵视图的实例。

   在 方法

- (void)hundredsFlowers

{

    DLFlowerFactory *factory = [[DLFlowerFactoryalloc]init];

    NSMutableArray *flowerList = [[NSMutableArrayalloc] initWithCapacity:600];

    

    DLFlyweightView *flyweightView = [[DLFlyweightViewalloc] initWithFrame:self.view.bounds];

    [self.viewaddSubview:flyweightView];

    

    for (int i =0 ; i<600; i++)

    {

        FlowerType flowerType =arc4random()%kTotalNumberOfFlowerTypes;

        UIView *flowerView = [factoryflowerViewWithType:flowerType];

        

        CGRect screenBounds = [[UIScreenmainScreen] bounds];

        

        // 随机的位置 随机的view 的10 - 50 之间的大小的 view

        CGFloat x = (arc4random() % (NSInteger)screenBounds.size.width);

        CGFloat y = (arc4random() % (NSInteger)screenBounds.size.height);

        NSInteger minSize = 10;

        NSInteger maxSize = 50;

        CGFloat size = (arc4random() % (maxSize - minSize + 1)) + minSize;


//        ExtrinsicFlowerState extrinsicState;

//        extrinsicState.flowerView = flowerView;

//        extrinsicState.area = CGRectMake(x, y, size, size);

        

        DLFlyweightMode *mode = [[DLFlyweightModealloc] init];

        mode.flowerView = flowerView;

        mode.area = CGRectMake(x, y, size, size);

        

        

//        [flowerList addObject:[NSValue value:&extrinsicState withObjCType:@encode(ExtrinsicFlowerState)]];

        

        [flowerList addObject:mode];

    

    }

    

//    [(DLFlyweightView *)self.view setFlowerList:flowerList];

    [flyweightView setFlowerList:flowerList];

}


  我们可以随便更改 600 为 500  或者 2000 等 发现内存并没有跟着涨 因为我们复用了 flowerView.

  这里如果你打开 我写的demo的话 ,你会 发现 DLFlowerView   和 DLFlyweightView  都是使用 drawRect 的方法来绘制 图片。 而不是直接使用UIImageView  设置 image   然后 加在父视图上呢? 






   





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
享元设计模式Flyweight Design Pattern)是一种用于优化大量对象创建和使用的设计模式。在Android开发中,使用享元模式可以有效地减少内存消耗和提高性能。 在享元模式中,对象被分为两种状态:内部状态和外部状态。内部状态是不变的,可以被多个对象共享,而外部状态是可变的,每个对象都有自己的外部状态。 在Android中,典型的例子是使用Bitmap对象来显示图片。当需要显示多个相同的图片时,可以使用享元模式来共享已加载的Bitmap对象,而不是每次都创建新的Bitmap对象。 以下是一个简单的示例代码: ```java public class BitmapFactory { private Map<String, Bitmap> bitmapCache = new HashMap<>(); public Bitmap getBitmap(String path) { Bitmap bitmap = bitmapCache.get(path); if (bitmap == null) { // 如果缓存中没有该Bitmap对象,则创建新的Bitmap对象 bitmap = BitmapFactory.decodeFile(path); bitmapCache.put(path, bitmap); } return bitmap; } } ``` 在上面的示例中,`BitmapFactory` 类使用一个 `bitmapCache` Map 来缓存已加载的 Bitmap 对象。当需要获取 Bitmap 对象时,首先从缓存中查找,如果找到则返回缓存的对象,否则创建新的 Bitmap 对象并存入缓存。 通过使用享元模式,可以避免重复创建相同的 Bitmap 对象,从而减少内存消耗。这在需要频繁加载和显示大量图片的应用中非常有用。 需要注意的是,享元模式适用于有大量相似对象的情况,并且需要权衡共享对象和创建对象的开销。在某些情况下,过度使用享元模式可能会导致代码复杂化,降低可读性和可维护性。因此,在使用享元模式时应根据实际情况进行评估和折衷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值