美文网首页
抽象工厂模式(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