美文网首页
『ios』设计模式— 工厂模式(简单工厂模式,工厂方法模式,抽象

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

作者: butterflyer | 来源:发表于2021-09-01 20:24 被阅读0次

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

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];

相关文章

  • 2016.06笔记

    iOS设计模式之工厂模式(简单工厂,工厂方法,抽象工厂) 简单工厂:简单工厂模式的工厂类一般是使用静态方法,通过接...

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • iOS设计模式(3)适配器模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(4)抽象工...

  • iOS设计模式(三)之抽象工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • iOS设计模式(一)之简单工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • iOS设计模式(二)之工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • 2021-11-16 - 学习记录

    设计模式学习:创建型:工厂(工厂方法,抽象工厂),建造者,单例,原型 设计模式:工厂模式 简单工厂 工厂方法 抽象工厂

  • Android设计模式:工厂设计模式

    目录 简单工厂模式工厂方法模式抽象工厂模式 简单工厂模式 简单工厂模式是所有工厂模式的基础,不属于23种设计模式范...

  • 设计模式-创建型模式-工厂模式(工厂三兄弟)

    设计模式-创建型模式-工厂模式(工厂三兄弟)工厂模式分为简单工厂,工厂方法,抽象工厂。 简单工厂模式 一个接口,三...

网友评论

      本文标题:『ios』设计模式— 工厂模式(简单工厂模式,工厂方法模式,抽象

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