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