Objective-C 工厂模式(下) -- 抽象工厂模式
相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的
抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产
比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买Android手机就创建一个Goolge工厂
这样创建工厂, 工厂, 用户这样就是我们要考虑的因素 (其实还有手机, 这里就跳过不讲了跟简单工厂模式里面一样)
创建工厂要有一个管理对象, 来根据客户的需求自动创建相应的工厂
工厂只要负责生产手机就好了
现在来构建代码
先写一个基本工厂模型
BaseFactory.h
1 #import <Foundation/Foundation.h> 2 3 @interface BaseFactory : NSObject 4 5 /** 6 创建手机方法 7 8 @return 返回手机对象 9 */ 10 - (id)createPhone; 11 12 @end
BaseFactory.m
1 #import "BaseFactory.h" 2 3 @implementation BaseFactory 4 5 - (id)createPhone { 6 7 //可以再添加代码禁止BaseFactory直接调用此方法 8 //只允许子类调用 9 return nil; 10 } 11 12 @end
来创建Apple工厂
AppleFactory.h
1 #import "BaseFactory.h" 2 3 @interface AppleFactory : BaseFactory 4 5 @end
AppleFactory.m
1 #import "AppleFactory.h" 2 3 @implementation AppleFactory 4 5 - (id)createPhone { 6 7 NSLog(@"创建Apple手机"); 8 //这里应该是再给给工程添加手机模型, 创建并返回手机对象 9 //现在只是举例 先不实现这部分 10 return nil; 11 } 12 13 @end
创建Google工厂
GoogleFactory.h
1 #import "BaseFactory.h" 2 3 @interface GoogleFactory : BaseFactory 4 5 @end
GoogleFactory.m
1 #import "GoogleFactory.h" 2 3 @implementation GoogleFactory 4 5 - (id)createPhone { 6 7 NSLog(@"创建Google手机"); 8 //这里应该是再给给工程添加手机模型, 创建并返回手机对象 9 //现在只是举例 先不实现这部分 10 return nil; 11 } 12 13 @end
下面是工厂管理者
FactoryManager.h负责根据用户需求创建工厂去生产
1 #import <Foundation/Foundation.h> 2 #import "AppleFactory.h" 3 #import "GoogleFactory.h" 4 5 typedef enum : NSUInteger { 6 kApple = 0x1, 7 kGoogle, 8 } EFactoryType; 9 10 @interface FactoryManager : NSObject 11 12 /** 13 创建手机工厂 14 15 @param type 工厂类别 16 @return 返回工厂对象 17 */ 18 + (id)createFactoryWithType:(EFactoryType)type; 19 20 @end
FactoryManager.m
1 #import "FactoryManager.h" 2 3 @implementation FactoryManager 4 5 + (id)createFactoryWithType:(EFactoryType)type { 6 7 BaseFactory *factory; 8 if (type == kApple) { 9 10 factory = [[AppleFactory alloc] init]; 11 12 } else if (type == kGoogle) { 13 14 factory = [[GoogleFactory alloc] init]; 15 16 } 17 18 return factory; 19 } 20 21 @end
下面是实现
1 #import "ViewController.h" 2 #import "FactoryManager.h" 3 4 @interface ViewController () 5 6 @end 7 8 @implementation ViewController 9 10 - (void)viewDidLoad { 11 12 [super viewDidLoad]; 13 14 //创建工厂 15 AppleFactory *factory = [FactoryManager createFactoryWithType:kApple]; 16 17 //工厂生产手机 18 [factory createPhone]; 19 20 } 21 22 23 24 @end
抽象工厂模式比简单工厂模式更加灵活