iOS設計模式之(五)生成器模式(建造模式)

本文首發於我的博客html

前言

什麼是生成器模式

生成器模式 又名:建造模式 屬於建立型模式,在wikipedia中的定義以下git

生成器模式(英:Builder Pattern)是一種設計模式,又名:建造模式,是一種對象構建模式。它能夠將複雜對象的建造過程抽象出來(抽象類別),使這個抽象過程的不一樣實現方法能夠構造出不一樣表現(屬性)的對象。github

適用性

在如下狀況使用生成器模式:算法

  • 當建立複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時;
  • 當構造過程必須容許被構造的對象有不一樣的表示時。

參與者

  • Builder 抽象建造者類
    • 爲建立一個Product對象的各個部件指定抽象接口。
  • ConcreteBuilder 建造者類
    • 實現Builder的接口以構造和裝配該產品的各個部件。
    • 定義並明確它所建立的表示。
    • 提供一個檢索產品的接口
  • Director 導演類
    • 構造一個使用Builder接口的對象。
  • Product 產品類
    • 表示被構造的複雜對象。ConcreateBuilder建立該產品的內部表示並定義它的裝配過程。
    • 包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。

代碼

YZBuilderCar

建立YZBuilderCar類,有兩個屬性,分別是名字和價格設計模式

#import <Foundation/Foundation.h>


@interface YZBuilderCar : NSObject
@property (nonatomic,   strong)NSString *name;// 名字
@property (nonatomic, strong)NSString *price;// 價格

-(YZBuilderCar *)makeCar;
@end
複製代碼

實現以下bash

#import "YZBuilderCar.h"

@interface YZBuilderCar()
@end


@implementation YZBuilderCar

- (NSString *)description{
    return [NSString stringWithFormat:@"我是一輛:%@ 車 價格:%@",self.name,self.price];
}

- (YZProductCar *)makeCar{
    YZBuilderCar *car = [[YZBuilderCar alloc] init];
    car.name = self.name;
    car.price = self.price;
    return  car;
}

@end
複製代碼

YZBMWCarYZAudiCar繼承自YZBuilderCar

建立車型YZBMWCar測試

#import "YZProductCar.h"


@interface YZBMWCar : YZBuilderCar

@end



#import "YZBMWCar.h"

@implementation YZBMWCar
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @"寶馬740Li";
        self.price = @"98萬";
    }
    return self;
}

@end


複製代碼

建立車型YZAudiCarui

#import "YZProductCar.h"


@interface YZAudiCar : YZBuilderCar

@end


#import "YZAudiCar.h"

@implementation YZAudiCar
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @"奧迪Q5";
        self.price = @"45萬";
    }
    return self;
}

@end
複製代碼

YZDirector

#import <Foundation/Foundation.h>

#import "YZBuilderCar.h"

@interface YZDirector : NSObject
// 建造一輛車
+ (YZProductCar *)creatBuickCar:(YZBuilderCar *)builder;
@end


#import "YZDirector.h"

@implementation YZDirector
+ (YZProductCar *)creatBuickCar:(YZBuilderCar *)builder{
    YZProductCar *car = [builder makeCar];
    return car;
}
@end


複製代碼

使用

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        YZBuilderCar *car = [[YZBMWCar alloc] init];
        YZDirector *dir = [YZDirector creatBuickCar:car];
        NSLog(@"%@",dir.description);
        
    }
    return 0;
}
複製代碼

輸出爲atom

我是一輛:寶馬740Li 車 價格:98萬spa

建造者模式的優勢

首先,建造者模式的封裝性很好。使用建造者模式能夠有效的封裝變化,在使用建造者模式的場景中,通常產品類和建造者類是比較穩定的,所以,將主要的業務邏輯封裝在Director類中對總體而言能夠取得比較好的穩定性。

其次,建造者模式很容易進行擴展。若是有新的需求,經過實現一個新的ConcreteBuilder類就能夠完成,基本上不用修改以前已經測試經過的代碼,所以也就不會對原有功能引入風險。

建造者模式與工廠模式的區別

咱們能夠看到,建造者模式與工廠模式是極爲類似的,整體上,建造者模式僅僅只比工廠模式多了一個"導演類"的角色。在建造者模式的類圖中,假如把這個導演類看作是最終調用的客戶端,那麼圖中剩餘的部分就能夠看做是一個簡單的工廠模式了。

與工廠模式相比,建造者模式通常用來建立更爲複雜的對象,由於對象的建立過程更爲複雜,所以將對象的建立過程獨立出來組成一個新的類——導演類。也就是說,工廠模式是將對象的所有建立過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;而建造者模式中,建造者類通常只提供產品類中各個組件的建造,而將具體建造過程交付給導演類。由導演類負責將各個組件按照特定的規則組建爲產品,而後將組建好的產品交付給客戶端。

總結

建造者模式與工廠模式相似,他們都是建造者模式,適用的場景也很類似。通常來講,若是產品的建造很複雜,那麼請用工廠模式;若是產品的建造更復雜,那麼請用建造者模式。

Demo地址

相關文章
相關標籤/搜索