iOS设计模式之美-工厂模式
iOS设计模式之美-抽象工厂模式
iOS设计模式之美-生成器模式
iOS设计模式之美-适配器模式
1.何为抽象工厂模式
抽象工厂模式为工厂模式的更细化区分。抽象工厂模式提供一个创建一系列相关或者相互依赖的对象接口,而无需指定它们的具体类。从上一篇文章iOS设计模式之美-工厂模式我们可知,工厂模式每种不同的产品都由不同的工厂负责生产。而抽象工厂模式则是一种工厂生产一系列相关的产品(产品族)
产品族:以产品平台为基础,通过添加不同的个性模块,以满足不同客户个性化需求的一组相关产品。
2.何时使用抽象工厂模式
- 批量调整一系列具有相同行为对象
例如:
套餐类型 | 汉堡 | 派 | 饮料 |
---|---|---|---|
A套餐 | 双层吉士汉堡 | 苹果派 | 可乐 |
B套餐 | 板烧鸡腿汉堡 | 菠萝派 | 雪碧 |
麦当劳同时提供了两种不同风味的优惠套餐供客户选择。满足于同时想吃汉堡、派和喝饮料的客户。长期选择A套餐的客户可能在某天想换换口味,这时他就会去尝试另外一种B套餐。尽管套餐变了,但是对于客户的基础要求仍旧可以满足(汉堡、派、饮料)。在基础需求上又为不同客户提供了更加个性化的选择正是抽象工厂模式的强大之处。
3.抽象工厂模式静态类结构图
4.案例
简单的贴下上述套餐选择的代码(以A套餐为例,B套餐代码同理):
WCQFactory.h
#import <Foundation/Foundation.h>
@class WCQHamburger, WCQPie, WCQDrink;
@interface WCQFactory : NSObject
- (WCQHamburger *)hamburger;
- (WCQPie *)pie;
- (WCQDrink *)drink;
@end
WCQFactory.m
#import "WCQFactory.h"
@implementation WCQFactory
- (WCQHamburger *)hamburger {
return nil;
}
- (WCQPie *)pie {
return nil;
}
- (WCQDrink *)drink {
return nil;
}
@end
WCQAFactory.m
#import "WCQAFactory.h"
#import "WCQCheeseHambueger.h"
#import "WCQCocaDrink.h"
#import "WCQApplePie.h"
@implementation WCQAFactory
- (WCQHamburger *)hamburger {
return [[WCQCheeseHambueger alloc] init];
}
- (WCQPie *)pie {
return [[WCQApplePie alloc] init];
}
- (WCQDrink *)drink {
return [[WCQCocaDrink alloc] init];
}
@end
WCQPie.h
#import <Foundation/Foundation.h>
@interface WCQPie : NSObject
- (void)beEaten;
@end
WCQPie.m
#import "WCQPie.h"
@implementation WCQPie
- (void)beEaten {
}
@end
WCQApplePie.m
#import "WCQApplePie.h"
@implementation WCQApplePie
- (void)beEaten {
NSLog(@"%s", __FUNCTION__);
}
@end
汉堡与饮料的代码与派同理这里也不贴了...
调用方式:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
WCQFactory *factory = [[WCQAFactory alloc] init];
WCQHamburger *hamburger = [factory hamburger];
WCQPie *pie = [factory pie];
WCQDrink *drink = [factory drink];
[hamburger beEaten];
[pie beEaten];
[drink beDrink];
}
此时如果我需要替换成B套餐则只需要将WCQAFactory
替换成WCQBFactory
的具体工厂类即可,而无需调整其他客户端逻辑
5.工厂模式与抽象工厂的区别
抽象工厂 | 工厂模式 |
---|---|
通过对象组合创建抽象产品 | 通过类继承创建抽象产品 |
创建多种产品 | 创建一种产品 |
必须修改抽象工厂接口才能支持新产品,并且会对所有子类工厂造成影响 | 子类化工厂并重载工厂方法即可创建新产品 |
以上为本人个人理解与分享,如有错误欢迎指出😊