浅谈设计模式

文章介绍了多种设计模式,包括单例模式确保类只有一个实例,工厂方法和抽象工厂模式用于对象创建,代理模式处理事件监听,装饰模式动态扩展功能,享元模式减少对象创建,行为型模式如观察者模式用于对象间通信,以及命令模式和NSInvocation的使用示例。
摘要由CSDN通过智能技术生成

创建型模式:

单例模式:在整个应用程序中,共享一份资源。保证在程序运行过程中,一个类只有一个实例,而且该实例只提供一个全局访问点供外界访问,从而方便控制实例个数,节约系统资源。
优点是:提供了对唯一实例的受控访问、可扩展、避免频繁创建销毁对象影响性能。
缺点是:延长了声明周期,一直存在占用内存。如果两个单例循环依赖会造成死锁,所以尽量不去产生单例间的依赖关系。

工厂方法模式:通过类继承创建抽象产品,创建一种产品,子类化创建者并重载工厂方法以创建新产品。

抽象工厂模式:通过对象组合创建抽象产品,可以创建多系列产品,必须修改父类的接口才能支持新的产品。

结构型模式:

代理模式:代理用来处理事件的监听和参数传递。@required修饰必须实现这个协议方法方法,@optional修饰是可选实现。使用方法时最好先判断方法是否实现respondsToSelector: ,避免找不到方法而崩溃。
delegate和block、Notification对比优缺点:delegate和block是一对一通信、block比delegate更加简洁清晰,但是如果通信事件较多时delegate运行成本较低且不易造成循环引用;
通知适合一对多通信,代码清晰简单,但问题查找溯源会比较困难,并且注册通知要注意在合适的时间移除,避免对野指针发送消息引起崩溃
(注意:iOS9之后已经做了弱引用处理不需要移除了,之前版本使用不安全引用__unsafe_unretained是为了兼容旧版本)。
类簇:见类簇的优缺点

装饰模式:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。如:分类。

享元模式:使用共享物件,减少同一类对象的大量创建。如:UITableviewCell复用。

行为型模式:

观察者模式:其本质上是一种发布-订阅模型,用来消除具有不同行为的对象之间的耦合,通过这一模式,不同对象可以协同工作。如:KVO。

命令模式:是一种将方法调用封装为对象的设计模式,在iOS中具体实现为NSInvocation。下边为NSInvocation的实现代码。

- (void)viewDidLoad {
    NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(sendMessageWithPhone:WithName:)]; // 方法签名:用来获得方法的返回类型和参数类型
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.target = self; // 目标:接收消息的对象
    invocation.selector = @selector(sendMessageWithPhone:WithName:); // 选择器:被发送的消息, 方法必须和签名中的方法一致。
    
    NSString *phone = @"13901234567";
    // 注意:设置参数的索引时不能从0开始,因为0已经被self占用,1已经被_cmd占用
    [invocation setArgument:&phone atIndex:2]; // 参数:可以添加任意数量的参数。
    NSString *name = @"9527";
    [invocation setArgument:&name atIndex:3];
    /*
     注:调用invocation的invoke方法,就代表需要执行NSInvocation对象中指定对象的指定方法,并且传递指定的参数
     */
    [invocation invoke];
}
- (void)sendMessageWithPhone:(NSString*)phone WithName:(NSString*)name {
    NSLog(@"电话号=%@, 姓名=%@",phone, name);
}
// 电话号=13901234567, 姓名9527
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值