美文网首页
抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)

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

抽象工厂模式:提供一个接口,用户创建相关或者依赖对象的家族,而不需要明确具体类型。

抽象工厂模式允许客户使用抽象的接口创建一组相关的产品,而不需要关心产出的具体产品是什么。这样一来客户就从具体的产品中解耦了出来。

抽象工厂模式

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

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

所以这里我们将生产过程由子类来实现,即我们提供一个美国的水果工厂和国产水果工厂。而各工厂分别生产苹果,橘子,桃子(假设这些类型没有太多的联系)。

回顾工厂方法模式我们不难发现代码中我们用了一个空的Fruit协议。空的Fruit协议提供了一个多态转换的能力,如果没有这个协议呢?

那么苹果是苹果,橘子是橘子,桃子是,桃子不过确实,他们除了能吃外没有更多本质上的联系。

当然并不能完全这么理解,工厂方法的本质是生产对象,所以侧重在对象上。而抽象工厂模式是提供了一个生产产品族的思路,所以抽象工厂模式提供的是一组产品的接口。

抽象工厂的协议 用来创建产品族

#import <Foundation/Foundation.h>
#import "Apple.h"
#import "Orange.h"
#import "Peach.h"

NS_ASSUME_NONNULL_BEGIN
@protocol FruitAbstractFactory  <NSObject>

//定义一个接口用于创建一个系列的产品簇,而不需要之名其具体类型
+(Apple *)createApple;
+(Orange *)createOrange;
+(Peach *)createPeach;

@end
NS_ASSUME_NONNULL_END

抽象工厂的具体子类实现 实现中的具体的产品可以参考工厂方法模式

#import "ChineseAbstracFactory.h"
#import "ChineseApple.h"
#import "ChinesePeach.h"
#import "ChineseOrange.h"

@implementation ChineseAbstracFactory

+(Apple *)createApple {
    
    Apple * fruit = [[ChineseApple alloc] init];
    return fruit;
}

+(Peach *)createPeach {
    
    Peach * fruit = [[ChinesePeach alloc] init];
    return fruit;
}

+(Orange *)createOrange {
    
    Orange * fruit = [[ChineseOrange alloc] init];
    return fruit;
}

@end

具体使用

Apple *abstractApple = [ChineseAbstracFactory createApple];
Orange *abstractOrange = [ChineseAbstracFactory createOrange];

优点

1.实现了用户与工厂,具体产品的解耦
2.将产品族统一管理,方便使用

缺点

1.产品族扩展困难,需要修改抽象工厂的接口
2.增加了系统的抽象性和理解难度

相关文章

网友评论

      本文标题:抽象工厂模式(Abstract Factory Pattern)

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