KRISKEE'S BLOG[GO]

简单工厂模式

  简单工厂模式(Simple Factory Pattern)是一种对相似类型对象的一种封装,使用工厂类创建对象,根据参数或条件获取相对应对象那个的一种设计模式。使用简单工厂模式,可以使使用者不用了解对象类内部的结构,直接使用工厂类接口就可以进行创建。如同一个工厂,可以生产多种产品,可能生产的产品不同,但是生产的工艺和方法类似。简单工厂模式可以理解为一个生产相似产品的工厂,我们则是消费者,我们不需要去了解产品的生产流程和工艺,只需要告诉工厂我的需求是什么,工厂便能替我们完成产品的加工和生产。同理,我能只需要将所需要创建的对象类型告诉工厂类方法,工厂类就会自动帮我们创建该对象。

  1.现在已Animal类为例,遵循AnimalProtocol协议;

  2.创建可选的协议方法 "- (void)eat" 和 "- (void)motion";

 1 // Animal.h
 2 
 3 #import <Foundation/Foundation.h>
 4 
 5 // 创建协议及其方法(可选方法)
 6 @protocol AnimalProtocol <NSObject>
 7 @optional
 8 - (void)eat;
 9 - (void)motion;
10 @end
11 
12 // 遵守协议
13 @interface Animal : NSObject<AnimalProtocol>
14 
15 @end

  3.创建其子类:Dog类,Fish类,Bird类,分别创建独有方法;

 1 // Dog.h
 2 #import "Animal.h"
 3 
 4 @interface Dog : Animal
 5 // 创建Dog类独有方法,狗叫
 6 - (void)DogCall;
 7 @end
 8 
 9 // Dog.m
10 #import "Dog.h"
11 
12 @implementation Dog
13 
14 - (void)DogCall{
15     NSLog(@"汪汪");
16 }
17 
18 - (void)eat{
19     NSLog(@"狗吃肉");
20 }
21 
22 - (void)motion{
23     NSLog(@"四足行走");
24 }
25 @end
 1 // Bird.h
 2 #import "Animal.h"
 3 
 4 @interface Bird : Animal
 5 // 创建Bird类独有方法,产卵
 6 - (void)layEggs;
 7 @end
 8 
 9 // Bird.m
10 #import "Bird.h"
11 
12 @implementation Bird
13 
14 - (void)layEggs{
15     NSLog(@"鸟会产卵");
16 }
17 
18 - (void)eat{
19     NSLog(@"鸟吃虫");
20 }
21 
22 - (void)motion{
23     NSLog(@"双翅飞行");
24 }
25 @end
 1 // Fish.h
 2 #import "Animal.h"
 3 
 4 @interface Fish : Animal
 5 // 创建Fish类独有方法,吐泡泡
 6 - (void)bubble;
 7 @end
 8 
 9 // Fish.m
10 #import "Fish.h"
11 
12 @implementation Fish
13 
14 - (void)bubble{
15     NSLog(@"鱼会吐泡泡");
16 }
17 
18 - (void)eat{
19     NSLog(@"鱼吃虾米");
20 }
21 
22 - (void)motion{
23     NSLog(@"水中游泳");
24 }
25 @end

  4.创建工厂类AnimalFactory,根据变量(枚举值 EAnimalType)进行创建不同的类对象。

 1 // AnimalFactory.h
 2 #import <Foundation/Foundation.h>
 3 #import "Dog.h"
 4 #import "Bird.h"
 5 #import "Fish.h"
 6 #import "Animal.h"
 7 
 8 typedef enum {
 9     kDog,
10     kBird,
11     kFish,
12 }EAnimalType;
13 
14 @interface AnimalFactory : NSObject
15 
16 + (Animal*)createAnimalWithType:(EAnimalType)type;
17 
18 @end
 1 // AnimalFactory.m
 2 #import "AnimalFactory.h"
 3 
 4 @implementation AnimalFactory
 5 
 6 + (Animal *)createAnimalWithType:(EAnimalType)type{
 7     Animal *animal = nil;
 8     if(type == kDog){
 9         animal = [Dog new];
10     }else if(type == kFish){
11         animal = [Fish new];
12     }else if(type == kBird){
13         animal = [Bird new];
14     }
15     return animal;
16 }
17 
18 @end

  最后,验证一下:

 1 #import "ViewController.h"
 2 #import "AnimalFactory.h"
 3 
 4 @interface ViewController ()
 5 
 6 @end
 7 
 8 @implementation ViewController
 9 
10 - (void)viewDidLoad {
11     [super viewDidLoad];
12     
13     // 根据工厂构造方法创建Animal对象
14     Animal *animal = [AnimalFactory createAnimalWithType:kDog];
15 
16     // 协议方法
17     [animal eat];
18     [animal motion];
19     
20     Fish *fish = (Fish*)[AnimalFactory createAnimalWithType:kFish];
21     
22     [fish eat];
23     [fish motion];
24     
25     // 独有方法
26     [fish bubble];
27 }
28 
29 @end

  工厂模式在iOS开发中是一种非常重要且常见的设计模式,在处理不同类型风格的视图控件类中尤其常见,还是以消息弹框(UIAlertController)为例:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];

// iOS 8 之后,创建消息弹框不再鼓励使用 UIAlertView(中间显示) 和 UIActionSheet(底部显示) 类,而统一使用UIAlertController类。在此,使用枚举值作为参数创建两种不同位置与风格的弹框,也属于工厂模式创建方法
// 枚举:
// UIAlertControllerStyleAlert       中间消息弹框
// UIAlertControllerStyleActionSheet 底部消息弹框

  总结:a.简单工厂是一个实体类,b.它简化了对象的创建过程,c.由工厂创建的对象有着共同的特点和某些相似的方法,d.使类的内部的细节不会暴漏。

posted @ 2016-03-30 14:55  Kriskee  阅读(170)  评论(0编辑  收藏  举报