『ios』设计模式— 工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

工厂模式就是我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式又分为简单工厂模式,工厂方法模式,抽象工厂模式。
下面的三张图,完美的解释了什么是工厂模式。
简单工厂模式

1419489-20190628144601084-563759643.png

工厂方法模式
1419489-20190628154133368-906051111.png

抽象工厂模式
1419489-20190628170705865-1781414242.png

工厂模式优点

一个调用者想创建一个对象,只要知道其名称就可以了。
扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
屏蔽产品的具体实现,调用者只关心产品的接口。

工厂模式缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

其实如果懂了抽象工厂模式,上面的两种模式也就都懂了。所以看下面这个例子。

现在我们要创建两个工厂,一个是苹果厂,一个是谷歌厂,同时苹果厂可以生产苹果手机和苹果手表,谷歌厂可以生产安卓手机和安卓手表,同时每部手机不光可以打电话,发短信,还都有自己独特的功能,苹果手机可以指纹识别,安卓可以主题定制。
需要先创建工厂基类。

@implementation BaseFactory

- (BasePhone *)createPhone {
    
    return nil;
}
- (BaseWatch *)createWatch {
    
    return nil;
}
@end

然后根据基类分别创建苹果厂和谷歌厂。

@implementation AppleFactory

- (BasePhone *)createPhone {
    
    return [[IPhone alloc] init];
}

- (BaseWatch *)createWatch {
    
    return [[IWatch alloc] init];
}

@end

@implementation GoogleFactory

- (BasePhone *)createPhone {
    
    return [[Android alloc] init];
}

- (BaseWatch *)createWatch {
    
    return [[AndroidWatch alloc] init];
}


@end

然后创建手机基类。

@interface BasePhone : NSObject <PhoneProtocol>

@end
@implementation BasePhone

- (void)phoneCall {
    
}
- (void)sendMessage {
    
}
@end

根据手机基类创建不同的手机。

@implementation IPhone

- (void)phoneCall {
    
    NSLog(@"iPhone phoneCall");
}

- (void)sendMessage {
    
    NSLog(@"iPhone sendMessage");
}

- (void)fingerprintIndetification {
    
    NSLog(@"iPhone fingerprintIndetification");
}


@end

@implementation Android

- (void)phoneCall {
    
    NSLog(@"Android phoneCall");
}

- (void)sendMessage {
    
    NSLog(@"Android sendMessage");
}

- (void)customTheme {
    
    NSLog(@"Android customTheme");
}


@end

创建不同工厂的工厂管理类。

typedef NS_ENUM(NSUInteger, KFactoryType) {
    
    KApple,
    KGoogle
};

@interface FactoryManager : NSObject


/**
 获取工厂

 @param factoryType 工厂类型
 @return 创建出的工厂
 */
+ (BaseFactory *)factoryWithBrand:(KFactoryType)factoryType;

@end
+ (BaseFactory *)factoryWithBrand:(KFactoryType)factoryType {
    BaseFactory *factory = nil;
    
    if (factoryType == KApple) {
        
        factory = [[AppleFactory alloc] init];
        
    } else if (factoryType == KGoogle) {
        
        factory = [[GoogleFactory alloc] init];
    }
    
    return factory;

}

@end

那么下面就是来使用了,屏蔽内部实现,通过不同工厂类组装成的抽象工厂模式

    // 获取工厂
    BaseFactory *googleFactory = [FactoryManager factoryWithBrand:KGoogle];
    
    // 创建商品
    Android *androidPhone = (Android *)[googleFactory createPhone];
    BaseWatch *androidWatch = [googleFactory createWatch];
    [androidPhone phoneCall];
    //定制主题
    [androidPhone customTheme];
    
    
    // 获取工厂
    BaseFactory *appleFactory = [FactoryManager factoryWithBrand:KApple];
    
    // 创建商品
    IPhone *applePhone = (IPhone *)[appleFactory createPhone];
    BaseWatch *appleWatch = [appleFactory createWatch];

    [applePhone phoneCall];
    //指纹识别
    [applePhone fingerprintIndetification];
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容