美文网首页
工厂方法模式(Factory Method Pattern)

工厂方法模式(Factory Method Pattern)

作者: iOS_学渣 | 来源:发表于2019-11-28 17:32 被阅读0次

工厂方法模式:定义了一个创建对象的接口但是由子类决定要实例化的类是哪一个。工厂方法模式让实例化的过程推迟到子类。

很显然工厂方法模式是创建型模式之一。

工厂方法模式

简单的工厂模式是一种开发思想(封装),将创建对象复杂的过程封装起来

工厂方法模式将封装过程延迟到子类来实现。

举个栗子
有一家水果公司的生意做的很大,在全球生产水果在国内销售。
在国内生产国产水果,在美国生产美国水果。

如果把国内生产水果和美国生产水果的逻辑放到一起,会不方便管理。我们不能期望在美国按中国的方式来生产

所以这里我们将生产过程由子类来实现,即我们提供一个美国的水果工厂和国产水果工厂。而各工厂分别实现其水果的生产。

开始贴代码
声明:代码中并不包含水果生产的差异,但是在理解的时候可以理解为他们之间存在差异。

声明一个水果的协议,这里我们水果感觉没啥方法要加,就给个空的吧。

#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.增加了系统的抽象性和理解难度

相关文章

网友评论

      本文标题:工厂方法模式(Factory Method Pattern)

      本文链接:https://www.haomeiwen.com/subject/njybwctx.html