工厂方法模式:定义了一个创建对象的接口但是由子类决定要实例化的类是哪一个。工厂方法模式让实例化的过程推迟到子类。
很显然工厂方法模式是创建型模式之一。
工厂方法模式简单的工厂模式是一种开发思想(封装),将创建对象复杂的过程封装起来
工厂方法模式将封装过程延迟到子类来实现。
举个栗子
有一家水果公司的生意做的很大,在全球生产水果在国内销售。
在国内生产国产水果,在美国生产美国水果。
如果把国内生产水果和美国生产水果的逻辑放到一起,会不方便管理。我们不能期望在美国按中国的方式来生产。
所以这里我们将生产过程由子类来实现,即我们提供一个美国的水果工厂和国产水果工厂。而各工厂分别实现其水果的生产。
开始贴代码
声明:代码中并不包含水果生产的差异,但是在理解的时候可以理解为他们之间存在差异。
声明一个水果的协议,这里我们水果感觉没啥方法要加,就给个空的吧。
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol Fruit <NSObject>
@end
NS_ASSUME_NONNULL_END
水果的基类,类型包含苹果,橘子,桃子,这里只贴苹果,其他水果创建类似,只换了个名字
#import <Foundation/Foundation.h>
#import "Fruit.h"
NS_ASSUME_NONNULL_BEGIN
@interface Apple : NSObject<Fruit>
@end
NS_ASSUME_NONNULL_END
具体产地的水果 这里只贴了国产苹果,其他的类似,都只换了个名字
#import "Apple.h"
NS_ASSUME_NONNULL_BEGIN
@interface ChineseApple : Apple
@end
NS_ASSUME_NONNULL_END
水果工厂的基类
#import <Foundation/Foundation.h>
#import "Fruit.h"
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger, FruitFacoryEnum) {
FruitFacoryEnumApple,
FruitFacoryEnumOrange,
FruitFacoryEnumPeach
};
@protocol FruitFacory <NSObject>
+(id<Fruit>)createFruitWithType:(FruitFacoryEnum)type;
@end
NS_ASSUME_NONNULL_END
中国水果工厂的实现
#import "ChinieseFruitFactory.h"
#import "ChineseApple.h"
#import "ChinesePeach.h"
#import "ChineseOrange.h"
@implementation ChinieseFruitFactory
+(id<Fruit>)createFruitWithType:(FruitFacoryEnum)type {
id <Fruit> fruit ;
switch (type) {
case FruitFacoryEnumApple:
fruit = [[ChineseApple alloc] init];
break;
case FruitFacoryEnumPeach:
fruit = [[ChinesePeach alloc] init];
break;
case FruitFacoryEnumOrange:
fruit = [[ChineseOrange alloc] init];
break;
}
return fruit;
}
@end
//创建国产水果
id<Fruit>apple = [ChinieseFruitFactory createFruitWithType:FruitFacoryEnumApple];
id<Fruit>orange = [ChinieseFruitFactory createFruitWithType:FruitFacoryEnumOrange];
//创建美国水果
id<Fruit>Aapple = [AmericaFuritFacory createFruitWithType:FruitFacoryEnumApple];
id<Fruit>Aorange = [AmericaFuritFacory createFruitWithType:FruitFacoryEnumOrange];
优点
1.用户只需要关系产品对应的工厂,不需要关系实现细节
2.加入新产品复合开闭原则,提高了可扩展性。
缺点
1.类的数量较多,增加了复杂度
2.增加了系统的抽象性和理解难度
网友评论