设计模式系列传送门
iOS设计模式(一)之简单工厂模式
iOS设计模式(二)之工厂模式
iOS设计模式(三)之抽象工厂模式
1、概述
首先说明一下,简单工厂模式不属于23种GOF设计模式之一。它也称作静态工厂方法模式,是工厂方法模式的特殊实现。
2、定义
“专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。”
世界上就是由一个工厂类,根据传入的参数,动态地决定创建出哪一个产品类的实例。
3、结构图
举个例子
简单工厂的生活场景,卖水果的小贩,他给你提供苹果,橘子等水果,小贩就是一个工厂,他为你提供苹果,橘子等水果,该场景对应的UML图如下
简单工厂模式UML图
简要分析下UML结构图
协议FruitProtocol具有一个属性name和一个方法createProduct,AppleFruit和OrangeFruit遵从FruitProtocol协议,简单工厂类为FruitFactory,负责根据传入的不同参数FruitType来决定生产的是AppleFruit还是OrangeFruit。
4、代码如下
简单工厂模式创建协议FruitsProtocol
再创建水果类AppleFruit以及OrangeFruit类遵从协议
创建水果工厂FruitFactory
FruitProtocol.h(协议)
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol FruitProtocol <NSObject>
/**水果名*/
@property (nonatomic,copy) NSString *name;
/**生产水果*/
-(void)createProduct;
@end
NS_ASSUME_NONNULL_END
AppleFruit.h
#import <Foundation/Foundation.h>
#import "FruitProtocol.h"
NS_ASSUME_NONNULL_BEGIN
@interface AppleFruit : NSObject<FruitProtocol>
@end
NS_ASSUME_NONNULL_END
AppleFruit.m
#import "AppleFruit.h"
@implementation AppleFruit
@synthesize name;
- (void)createProduct {
NSLog(@"生产%@",self.name);
}
@end
OrangeFruit.h
#import <Foundation/Foundation.h>
#import "FruitProtocol.h"
NS_ASSUME_NONNULL_BEGIN
@interface OrangeFruit : NSObject<FruitProtocol>
@end
NS_ASSUME_NONNULL_END
OrangeFruit.m
#import "OrangeFruit.h"
@implementation OrangeFruit
@synthesize name;
- (void)createProduct {
NSLog(@"生产%@",self.name);
}
@end
FruitFactory.h
#import <Foundation/Foundation.h>
#import "FruitProtocol.h"
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger,FruitType){
FruitTypeApple,
FruitTypeOrange,
};
@interface FruitFactory : NSObject
+(id<FruitProtocol>)initWithType:(FruitType)type;
@end
NS_ASSUME_NONNULL_END
FruitFactory.m
#import "FruitFactory.h"
#import "AppleFruit.h"
#import "OrangeFruit.h"
@implementation FruitFactory
+(id<FruitProtocol>)initWithType:(FruitType)type{
id<FruitProtocol> factory = nil;
switch (type) {
case FruitTypeApple:
factory = [[AppleFruit alloc] init];
break;
case FruitTypeOrange:
factory = [[OrangeFruit alloc] init];
break;
default:
break;
}
return factory;
}
@end
调用简单工厂方法
#import "ViewController.h"
#import "FruitFactory.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
id<FruitProtocol> factory1 = [FruitFactory initWithType:FruitTypeApple];
factory1.name = @"苹果";
[factory1 createProduct];
id<FruitProtocol> factory2 = [FruitFactory initWithType:FruitTypeOrange];
factory2.name = @"橘子";
[factory2 createProduct];
}
@end
5、 优缺点
从上面的介绍可以看出,简单工厂模式的优点是客户端可以直接消费产品,而不必关心具体产品的实现,消除了客户端直接创建产品对象的责任,实现了对责任的分割。
简单点说就是客户端调用简单明了,不需要关注太多的逻辑。缺点是工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都会受到影响,而且当产品类别多结构复杂的时候,把所有创建工作放进一个工厂来,会使后期程序的扩展较为困难。产品类本身是符合
开闭原则
的,对扩展开放对修改关闭,但是工厂类却违反了开闭原则,因为每增加一个产品,工厂类都需要进行逻辑修改和判断,导致耦合度太高。例如增加一个BananaFruit,在工厂类FruitFactory就要新增加一个枚举FruitTypeBanana。开闭原则:一个软件实体(如类、模块、函数)应当对扩展开放,对修改关闭。
开放-封闭原则的思想就是设计的时候,尽量让设计的类做好后就不再修改,如果有新的需求,通过新加类的方式来满足,而不去修改现有的类(代码)。
网友评论