简单工厂模式
简单工厂模式(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.使类的内部的细节不会暴漏。