美文网首页
iOS --设计模式(4、工厂方法模式)

iOS --设计模式(4、工厂方法模式)

作者: oneYing | 来源:发表于2017-01-12 22:38 被阅读37次

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推到子类。

现在有一个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

相关文章

网友评论

      本文标题:iOS --设计模式(4、工厂方法模式)

      本文链接:https://www.haomeiwen.com/subject/tsjjbttx.html