iOS设计模式|iOS设计模式 (三) 工厂模式之简单工厂

工厂模式:简单工厂,工厂方法,抽象工厂

简单工厂
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
【iOS设计模式|iOS设计模式 (三) 工厂模式之简单工厂】简单工厂UML图
iOS设计模式|iOS设计模式 (三) 工厂模式之简单工厂
文章图片
1.png
工厂(FruitsFactory)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品(Fruits)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Apple Banana Orange)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例
demo实现
  • FruitsFactory 类
#import #import "Apple.h" #import "Orange.h" #import "Banana.h" typedef NS_ENUM(NSInteger){ kApple, kOrange, kBanana, }FruitsType; @interface FruitsFactory : NSObject + (Fruits *)fruitsFactory:(FruitsType)type; @end#import "FruitsFactory.h"@implementation FruitsFactory+ (Fruits *)fruitsFactory:(FruitsType)type { Fruits *fruits = nil; switch (type) { case kApple: fruits = [[Apple alloc] init]; break; case kOrange: fruits = [[Orange alloc] init]; break; case kBanana: fruits = [[Banana alloc] init]; break; default: break; } return fruits; } @end

  • Fruits类(抽象产品)
#import @interface Fruits : NSObject- (void)sweet; - (void)poorTasete; //不好吃@end#import "Fruits.h"@implementation Fruits- (void)sweet{}- (void)poorTasete{}//不好吃@end

  • Apple类(具体产品)
#import "Fruits.h"//遵循了开闭原则, //遵循了开闭原则,继承父类,但是并不改变父类的方法,自己扩展 @interface Apple : Fruits- (void)freshApple; /*新鲜水果*/@end#import "Apple.h"@implementation Apple- (void)sweet { NSLog(@"Apple 非常甜"); }- (void)poorTasete { NSLog(@"Apple 不好吃"); }- (void)freshApple { NSLog(@"Apple 新鲜的水果"); }@end

  • Orange类(具体产品)
#import "Fruits.h"@interface Orange : Fruits- (void)acidOrange; @end #import "Orange.h"@implementation Orange- (void)acidOrange { NSLog(@"Orange 确实有点酸"); }- (void)sweet { NSLog(@"Orange 非常甜"); }- (void)poorTasete { NSLog(@"Orange 不好吃"); } @end

  • ViewController类(具体产品)
#import @interface ViewController : UIViewController @end #import "ViewController.h" #import "FruitsFactory.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; //创建水果,在工厂方法创建 Fruits *fruits = [FruitsFactory fruitsFactory:kApple]; [fruits sweet]; //创建橘子 Orange *orange = (Orange *)[FruitsFactory fruitsFactory:kOrange]; [orange acidOrange]; } @end

  • 源代码请见:https://github.com/defuliu/sampleFactory.git

    推荐阅读