第20月第29天cocoa抽象工厂(代码片段)

lianhuaren lianhuaren     2022-11-18     401

关键词:

1.

在 Cocoa Touch 框架中,类簇是抽象工厂模式在 iOS 下的一种实现,以 NSArray 举例,将原有的 alloc+init 拆开写:

id obj1 = [NSArray alloc]; // __NSPlacehodlerArray *
id obj2 = [NSMutableArray alloc];  // __NSPlacehodlerArray *
id obj3 = [obj1 init];  // __NSArrayI *
id obj4 = [obj2 init];  // __NSArrayM *

发现 + alloc 后并非生成了我们期望的类实例,而是一个NSPlacehodlerArray 的中间对象,后面的 – init 或 – initWithXXXXX 消息都是发送给这个中间对象,再由它做工厂,生成真的对象。这里的 NSArrayI 和 __NSArrayM 分别对应 Immutable 和 Mutable(后面的 I 和 M 的意思)

于是顺着思路猜实现,__NSPlacehodlerArray 必定用某种方式存储了它是由谁 alloc 出来的这个信息,才能在 init 的时候知道要创建的是可变数组还是不可变数组。

抽象工厂将一系列的产品族统一到一起创建,增加产品族很方便,但增加产品很麻烦,需要改动太多的类的接口。 ####生成器(Builder) 将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现。 生成器可以将构建对象的过程分为,客户 – 指导者 – 生成器 的关系,

CharacterBuilder *characterBuilder = [[StandarCharacterBuilder alloc] init];
ChasingGame *game = [[ChasingGame alloc] init];

Character *player = [chasingGame createPlayer:characterBuilder];
Character *enemy = [chasingGame createEnemy:characterBuilder];

characterBuilder 就是生成器了,而 game 就是指导者。指导者里声明了创建不同表现的对象的方法。而方法里由生成器 characterBuilder 来构建不同的 Character 类型的对象。

  • 生成器模式将复杂的生成对象的过程交给了生成器去完成,作为客户的我们只需要根据简单的接口去生成不同表现的对象。如上述代码中的 player 以及 enemy。玩家和敌人具体的属性数值我们不需要去设置,而是交给生成器去设置。

 

https://github.com/al1020119/iCocosDesignPattern

http://ios.jobbole.com/85360/

https://draveness.me/2017-summary

 

第37月第29天avplayer截屏

1.-(void)displayLinkCallback:(CADisplayLink*)sender{CMTimetime=[snapshotOutputitemTimeForHostTime:CACurrentMediaTime()];if([snapshotOutputhasNewPixelBufferForItemTime:time]){lastSnapshotPixelBuffer=[s 查看详情

第32月第12天blockstop(代码片段)

1.-(NSMutableArray*)filterUsingBlock:(BOOL(^)(idobj,NSUIntegeridx,BOOL*stop))blockif(!block)return[selfmutableCopy];NSMutableArray*result=[NSMutableArrayarray];NSUIntegeridx=0;BOOLstop=NO;for(idobj 查看详情

第27月第10天cmake(代码片段)

1.error:tool‘xcodebuild‘requiresXcode的解决办法 sudoxcode-select--switch/Applications/Xcode.app/Contents/Developer/   https://blog.csdn.net/shorewb/article/details/52447554  2 查看详情

第15月第29天ffmpegaverror_eof

1.在直播时返回AVERROR_EOF代表流结束吗?但对方还在直播,没有结束。 intret=av_read_frame(mContext,pkt); if(ret==AVERROR_EOF) 查看详情

第26月第20天springboot

1.1、pom.xml中添加支持web的模块:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>pom.xml文件中默认有两个模块:spring- 查看详情

第199天学习打卡(工厂模式简单工厂模式)(代码片段)

...建者和调用者的分离详细分类简单工厂模式工厂方法模式抽象工厂模式OOP七大原则(工厂模式满足下面三个原则)开闭原则:一个软件的实体应当对外扩展开放,对修改关闭依赖倒转原则:要针对接口编程ÿ... 查看详情

第43月第10天uiimage写文件(代码片段)

1.-(void)saveImage:(CGImageRef)imagedirectoryURL:(NSURL*)directoryURLfilename:(NSString*)filename@autoreleasepoolNSURL*fileURL=[directoryURLURLByAppendingPathComponent:filename];//fileURL=[NSURLfileURLWithPath:[NSStringstringWithFormat:@"%@/%@",directory,filename]];CFURLRefurl=(__bridgeCFURLRef)file... 查看详情

第25月第26天dispatch_group(代码片段)

1.dispatch_group_enter(group);dispatch_group_leave(group); dispatch_group_notify(group1,queue1,block);在这种组合下,根据任务是同步、异步又分为两种,这两种组合的执行代码与运行结果如下:第一种:同步任务时dispatch_queue_tqueue2=dispatch_queue_creat 查看详情

一天一个设计模式:抽象方法模式(代码片段)

为什么引入抽象工厂模式?或者说抽象工厂模式与工厂方法模式的区别?工厂方法模式针对的是一类产品的等级结构,而抽象工厂模式针对的是多个产品等级结构(一个产品族)。引入概念:产品族与产品等级产品族:指在不同... 查看详情

第29月第14天evpp

1.evpp https://github.com/Qihoo360/evpp/tree/master/examples/recipes/self_control_timerhttps://blog.csdn.net/zieckey/article/details/70245013  2.enable_shared_from_this shared_ptr接收裸指针,更改引用计数。shared_ptr接收shared_ptr,更改引用计数。在类的内... 查看详情

第20月第22天2016计算机大会后记——机器学习:发展与未来

1.2016计算机大会后记——机器学习:发展与未来 http://www.cnblogs.com/winifred-tang94/p/6028487.html 40:00左右http://www.iqiyi.com/v_19rr9nbim0.html?dummy=&wx_uid1=wxidoG0a9jpBi8LndTiBR2JI2PlP1CPE& 查看详情

设计模式实践笔记第二节:抽象工厂模式(代码片段)

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式(AbstractFactory)也是一种创建型设计模式,通常用来解决「产品族」的创建问题。抽象工厂模式结构工厂模... 查看详情

《设计模式奇妙之旅》第3章抽象工厂模式(代码片段)

第3章抽象工厂模式3.1关于抽象工厂模式我们在上面学习了,工厂方法模式,如果我们以前没有正确的使用过面向对象的知识。我们会惊讶工厂方法模式,ohmygad原来还有这种操作。这次我们即将学习的一种设计模式叫... 查看详情

第28月第8天(代码片段)

1.JS统计输入字符串在UTF-8编码下的长度 /***计算字符串所占的内存字节数,默认使用UTF-8的编码方式计算,也可制定为UTF-16*UTF-8是一种可变长度的Unicode编码格式,使用一至四个字节为每个字符编码**000000-00007F(128个代码)0zzzzzzz(... 查看详情

:设计模式第29节:面试常考设计模式(下)(代码片段)

...厂方法模式的类图:其中,Product和ConcreteProduct分别表示抽象产品类和具体产品类。Creator和ConcreteCreator则分别表示抽象创建类和具体创建类。抽象创建类Creator中定义了创建产品的方法createProduct。这里我们给出一个简单的工厂方... 查看详情

抽象工厂(代码片段)

2018-11-02 20:54:09开始写  IFactory.java类(顶层)1packageAbstractFactory;23publicinterfaceIFactory4publicIUsercreateUser();5publicIDepartmentcreateDepartment();6IUser.java类(下层)1packageAbstra 查看详情

设计模式实践笔记第二节:抽象工厂模式(代码片段)

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式(AbstractFactory)也是一种创建型设计模式,通常用来解决「产品族」的创建问题。抽象工厂模式结构工厂模... 查看详情

设计模式实践笔记第二节:抽象工厂模式(代码片段)

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式(AbstractFactory)也是一种创建型设计模式,通常用来解决「产品族」的创建问题。抽象工厂模式结构工厂模... 查看详情