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

工厂方法(Factory Method)

作者: long弟弟 | 来源:发表于2022-09-09 07:59 被阅读0次

    工厂方法

    一般情况下,工厂模式分为:简单工厂工厂方法抽象工厂

    简单工厂模式(Simple Factory)

    简单工厂并不是GoF的23种设计模式的一种,是工厂方法的一种特例,也称为静态工厂方法模式(Static Factory Method Pattern)。

    简单工厂模式.jpg

    角色和职责

    1. 工厂(Creator)
      简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。Creator工厂类可以被外界直接调用,创建所需的产品对象。
    2. 抽象(AbstractProduct)
      简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    3. 具体产品(ConCreteProduct)
      简单工厂模式所创建的具体实例对象。

    代码示例

    #import <Foundation/Foundation.h>
    
    @interface AbstractProduct : NSObject
    - (void)anOperation;
    @end
    @implementation AbstractProduct
    @end
    
    @interface AProduct : AbstractProduct
    @end
    
    @implementation AProduct
    - (void)anOperation {
        NSLog(@"A Product");
    }
    @end
    
    @interface BProduct : AbstractProduct
    @end
    
    @implementation BProduct
    - (void)anOperation {
        NSLog(@"B Product");
    }
    @end
    
    @interface Factory : NSObject
    - (AbstractProduct *)createProduct:(NSString *)name;
    @end
    @implementation Factory
    - (AbstractProduct *)createProduct:(NSString *)name {
        if ([name isEqualToString:@"A"]) {
            return [[AProduct alloc] init];
        }else if ([name isEqualToString:@"B"]) {
            return [[BProduct alloc] init];
        }
        return nil;
    }
    @end
    
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Factory *f1 = [[Factory alloc] init];
            AbstractProduct *product1 = [f1 createProduct:@"A"];
            [product1 anOperation];
            
            AbstractProduct *product2 = [f1 createProduct:@"B"];
            [product2 anOperation];
            
        }
        return 0;
    }
    

    优缺点

    在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以根据工厂类去创建所需的实例,而无需了解这些对象是如何创建的以及如何组织的。有利于软件体系结构的优化。

    不难发现简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品不断增多时,可能要求工厂类也要作出相应的修改,扩展性并不好。违反了开闭原则。

    工厂方法(Factory Method)

    意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使得一个类的实例化延迟到其子类。

    利用多态去掉if逻辑分支,对上面的代码进行重构。

    工厂方法.jpg

    代码实例

    #import <Foundation/Foundation.h>
    
    @interface AbstractProduct : NSObject
    - (void)anOperation;
    @end
    @implementation AbstractProduct
    @end
    
    @interface AProduct : AbstractProduct
    @end
    
    @implementation AProduct
    - (void)anOperation {
        NSLog(@"A Product");
    }
    @end
    
    @interface BProduct : AbstractProduct
    @end
    
    @implementation BProduct
    - (void)anOperation {
        NSLog(@"B Product");
    }
    @end
    
    @interface CProduct : AbstractProduct
    @end
    
    @implementation CProduct
    - (void)anOperation {
        NSLog(@"C Product");
    }
    @end
    
    @interface AbstractFactory : NSObject
    - (AbstractProduct *)createProduct;
    @end
    @implementation AbstractFactory
    @end
    
    @interface AFactory : AbstractFactory
    @end
    @implementation AFactory
    - (AbstractProduct *)createProduct {
        return [[AProduct alloc] init];
    }
    @end
    
    @interface BFactory : AbstractFactory
    @end
    @implementation BFactory
    - (AbstractProduct *)createProduct {
        return [[BProduct alloc] init];
    }
    @end
    
    @interface CFactory : AbstractFactory
    @end
    @implementation CFactory
    - (AbstractProduct *)createProduct {
        return [[CProduct alloc] init];
    }
    @end
    
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            AbstractFactory *f1 = nil;
            f1 = [[AFactory alloc] init];
            
            AbstractProduct *product1 = [f1 createProduct];
            [product1 anOperation];
            
            f1 = [[BFactory alloc] init];
            AbstractProduct *product2 = [f1 createProduct];
            [product2 anOperation];
            
            f1 = [[CFactory alloc] init];
            AbstractProduct *product3 = [f1 createProduct];
            [product3 anOperation];
            
        }
        return 0;
    }
    

    优点

    去掉if分支逻辑也实现了工厂类和产品类的解耦。更符合开闭原则。

    缺点

    只能生产单一的产品,不能生产产品族。创建一个产品,对应的也要创建一个生产该产品的工厂(类或过多)。

    相关文章

      网友评论

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

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