IOS面试题(设计模式相关) --- 工厂设计模式

2022-06-26  本文已影响0人  ShawnAlex

OC面试题目合集地址

问题1: ios什么是简单工厂设计模式

结合例子看一下:


例子

例子代码

结合代码看一下:

例子

SimpleFactory.h

#import <Foundation/Foundation.h>
#import "Cola.h"
#import "CocaCola.h"
#import "PepsiCola.h"

typedef NS_ENUM(NSInteger, SimpleFactoryColeType) {
    SimFacCocaCola,
    SimFacPepsiCola
};

NS_ASSUME_NONNULL_BEGIN

@interface SimpleFactory : NSObject

// 工厂:接受客户端的请求,通过请求负责创建相应的产品对象。
+ (Cola *)factoryProductCola:(SimpleFactoryColeType)colaType;

@end

NS_ASSUME_NONNULL_END

SimpleFactory.m

#import "SimpleFactory.h"

@implementation SimpleFactory

// 工厂:接受客户端的请求,通过请求负责创建相应的产品对象。
+ (Cola *)factoryProductCola:(SimpleFactoryColeType)colaType {
    
   // 通常枚举, if也可
    switch (colaType) {
        case SimFacCocaCola:
            return [CocaCola new];
            
        case SimFacPepsiCola:
            return [PepsiCola new];
            
        default:
            return nil;
            break;
    }
    
}

@end

CocaCola

#import "CocaCola.h"

@implementation CocaCola

- (void)sayCola {
    
    NSLog(@"sayCocaCola");
}

@end

PepsiCola

#import "PepsiCola.h"

@implementation PepsiCola


- (void)sayCola {
    NSLog(@"sayPepsiCola");
}

@end
运行结果

由此可以看出简单工厂的优缺点:


问题2: ios什么是工厂设计模式

例子

其实工厂模式具有OOP的多态性,将工厂和产品都抽象出一个基类,在基类中定义统一的接口,然后在具体的工厂中创建具体的产品。比起简单工厂,工厂方法就不需要判断,耦合度低了不少。

例子代码

Factory.h

#import <Foundation/Foundation.h>
#import "Cola.h"
#import "CocaCola.h"
#import "PepsiCola.h"

NS_ASSUME_NONNULL_BEGIN

@interface Factory : NSObject

@end

@interface CocaColaFactory : Factory

+ (Cola *)productCocaCola;

@end

@interface PepsiColaFactory : Factory

+ (Cola *)productPepsiCola;

@end

Factory.m

#import "Factory.h"

@implementation Factory

@end

@implementation CocaColaFactory

+ (Cola *)productCocaCola {
    
    Cola *cola = [[CocaCola alloc] init];
    return cola;
}

@end


@implementation PepsiColaFactory

+ (Cola *)productPepsiCola {
    Cola *cola = [[PepsiCola alloc] init];
    return cola;
    
}

@end

CocaCola

#import "CocaCola.h"

@implementation CocaCola

- (void)sayCola {
    
    NSLog(@"sayCocaCola");
}

@end

PepsiCola

#import "PepsiCola.h"

@implementation PepsiCola


- (void)sayCola {
    NSLog(@"sayPepsiCola");
}

@end
例子

由此可以看出工厂模式的优缺点:


问题3: ios什么是抽象工厂模式

其中产品族: 是指位于不同产品等级结构,功能相关联的产品组成的家族。例如:
百事瓶盖、百事瓶子、百事饮料水组成一个家族,可口瓶盖、可口瓶子、可口饮料水组成另一个家族。而这两个家族有三个产品等级:瓶盖、瓶子、饮料水。一个等级结构是由相同的结构的产品组成。

例子

例子代码

AbstractFactory.h

#import <Foundation/Foundation.h>
#import "ColaThemeFactory.h"

typedef NS_ENUM(NSInteger, AbstractFactoryColeType) {
    CocaThemeFactoryType,
    PepsiThemeFactoryType
};


NS_ASSUME_NONNULL_BEGIN

@interface AbstractFactory : NSObject

+ (ColaThemeFactory *)factoryWithModel:(AbstractFactoryColeType)modelType;

@end

NS_ASSUME_NONNULL_END

AbstractFactory.m

#import "AbstractFactory.h"
#import "ColaThemeFactory.h"
#import "PepsiThemeFactory.h"

@implementation AbstractFactory


+ (ColaThemeFactory *)factoryWithModel:(AbstractFactoryColeType)modelType {
    
    if (modelType == PepsiThemeFactoryType) {
        return  [[PepsiThemeFactory alloc] init];
    }else if (modelType == CocaThemeFactoryType) {
        return  [[ColaThemeFactory alloc] init];
    }
    
    return nil;
    
}

@end

ColaThemeFactory.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface ColaThemeFactory : NSObject


- (void)productCola;
- (void)productCap;
- (void)productSparklingWater;
- (void)productBottle;

@end

NS_ASSUME_NONNULL_END

ColaThemeFactory.m

#import "ColaThemeFactory.h"

@implementation ColaThemeFactory


- (void)productCola {
    
    [self productBottle];
    [self productSparklingWater];
    [self productCap];
}

@end

PepsiThemeFactoryCocaThemeFactory一样只是打印文字不同, 只写一个, 详细可见评论区demo



PepsiThemeFactory.h

#import "ColaThemeFactory.h"

NS_ASSUME_NONNULL_BEGIN

@interface PepsiThemeFactory : ColaThemeFactory

- (void)productCap;
- (void)productSparklingWater;
- (void)productBottle;

@end

NS_ASSUME_NONNULL_END

PepsiThemeFactory.m

#import "PepsiThemeFactory.h"

@implementation PepsiThemeFactory

- (void)productCap {
    NSLog(@"生产百事瓶盖");
}

- (void)productSparklingWater {
    NSLog(@"生产百事饮料水");
}

- (void)productBottle {
    NSLog(@"生产百事瓶子");
}


@end
例子
抽象工厂模式 工厂模式
派生多个具体工厂类 派生多个具体产品类
可以产生多个系列的产品 一个工厂只能产生一种产品
必须修改父类的接口才能支持新的产品 子类化创建者并重载工厂方法以创建新产品

由此可以看出抽象工厂模式的优缺点:

上一篇 下一篇

猜你喜欢

热点阅读