工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推到子类。
现在有一个Pizza基类,其定义了pizza的基本制做流程:
#import <Foundation/Foundation.h>
@interface WYXPizza : NSObject
@property (nonatomic, strong) NSString *pizzaName; // pizza的名字
@property (nonatomic, strong) NSString *dough; // 什么面团
@property (nonatomic, strong) NSString *sauce; // 酱料
@property (nonatomic, strong) NSArray<NSString *> *toppings; // 佐料
// 准备过程
- (void)prepare;
// 烘焙
- (void)bake;
// 切块
- (void)cut;
// 装盒
- (void)box;
@end
不同pizza有不同的名字,不同地区制做pizza用的面团也不一样,用得酱料、佐料也不同。
具体实现为:
#import "WYXPizza.h"
@implementation WYXPizza
- (void)prepare{
NSLog(@"preparing:%@",self.pizzaName);
NSLog(@"tossing douch...");
NSLog(@"adding sauce...");
for (NSString *topping in self.toppings) {
NSLog(@"with: %@",topping);
}
}
- (void)bake{
NSLog(@"烘培");
}
- (void)cut{
NSLog(@"切块");
}
- (void)box{
NSLog(@"包装");
}
pizza的种类很多,不同地区同一种pizza的制做方法又不同。所以很多WYXPizza的子类。
例如:NYStyleCheesePizza纽约风味的芝士pizza
#import "WYXPizza.h"
@interface WYXNYStyleCheesePizza : WYXPizza
@end
#import "WYXNYStyleCheesePizza.h"
@implementation WYXNYStyleCheesePizza
- (instancetype)init{
self = [super init];
if (self) {
self.pizzaName = @"NYStyleCheesePizza";
self.dough = @"Thin crust dough";
self.sauce = @"Marinara sauce";
self.toppings = @[@"意大利高级干奶酪"];
}
return self;
}
@end
当我们在一个类中需要根据条件创建一个Pizza子类时,我们总不能这样
if(PizzaStyle == NYCheesePizaa){
pizza = [ [WYXNYStyleCheesePizza alloc] init]
}else if(PizzaStyle == ChicagoCheesePizaa){
pizza = [ [WYX ChicagoCheesePizaa alloc] init]
}
做这些Low且麻烦的代码。
我们可以创建一个工厂类,由它的子类来决定
#import <Foundation/Foundation.h>
#import "WYXPizza.h"
#import "Header.h"
@interface WYXPizzaStore : NSObject
@property (nonatomic, strong) WYXPizza *pizzaObj;
// 顾客定制pizza,并表明pizza类型
- (WYXPizza *)orderPizza:(PizzaType)type;
// 制做pizza
- (WYXPizza *)creatPizza:(PizzaType)type;
@end
具体实现
#import "WYXPizzaStore.h"
#import "WYXPizza.h"
@implementation WYXPizzaStore
- (WYXPizza *)orderPizza:(PizzaType)type{
WYXPizza *piz = [self creatPizza:type];
[piz prepare];
[piz bake];
[piz cut];
[piz box];
return piz;
}
- (WYXPizza *)creatPizza:(PizzaType)type{
return nil;
}
@end
其中creatPizza方法被orderPizza方法调用,但在基类中不做实现。
现在创建制做纽约风味pizza的子工厂:
#import "WYXPizzaStore.h"
@interface WYXNYPizzaStore : WYXPizzaStore
@end
#import "WYXNYPizzaStore.h"
#import "WYXNYStyleCheesePizza.h"
@implementation WYXNYPizzaStore
- (WYXPizza *)creatPizza:(PizzaType)type{
WYXPizza *pizza;
if (type == NYStypeCheesePizza) {
pizza = [[WYXNYStyleCheesePizza alloc] init];
}
return pizza;
}
@end
在子类中,重写creatPizza方法。
现在来定制一份纽约风味的芝士pizza.
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
WYXPizzaStore *pizSto = [WYXNYPizzaStore new];
WYXPizza *piz = [pizSto orderPizza:NYStypeCheesePizza];
}
[代码地址 ]
https://git.oschina.net/handanying/FactoryMethodPattern.git
网友评论