Objective C 建造者模式

如果你需要將一個複雜對象的構建於它的表示分離,使得同樣的構建過程可以創建不同的表示的意圖時,那我們就需要這個模式,建造者模式又叫生成器模式。建造者模式可以將一個產品的內部表象與產品的生成過程分割開來,從而可以使一個建造過程生成具有不同的內部表象的產品對象。如果我們用了建造者模式,那麼用戶就只需要指定需要建造的類型就可以得到它們,而具體建造的過程和細節就不需知道了。

   下面給出建造者模式的定義:

   建造者模式(Builder),將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

   其實,基本上來說,建造者模式是在當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時適用的模式。

   下面,給大家呈現一下建造者模式的類結構圖:


   讓我們簡單瞭解一下上面這張圖中各個類表示的意思。其中Builder是爲創建一個Product對象指定的抽象接口,這裏面的Product顧名思義,就是我們要最終展現的具體產品類。繼承自Builder接口的ConcreteBuilder類,是具體建造者,構造和裝配各個部件。那麼Director是什麼呢?它是指揮具體建造者構建產品的總指揮,相當於一個指揮員。好吧,說的有些抽象,下面給大家展示一下簡單的代碼實現,大家可以慢慢體會一下。

  • Product類接口

1
2
3
4
5
6
7
8
9
#import <Foundation/Foundation.h>
                           
@interface Product :NSObject{   
@private NSMutableString *mus;   
}
-(Product*)MyInit;
-(void)Add:(NSString*)s;
-(void)Show;
@end
  • Product類實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import "Product.h"
                        
@implementation Product
-(Product*)MyInit{
    mus= [NSMutableString stringWithString:@""];
    return self;
}
-(void)Add:(NSString*)s{
    [mus appendString:s];
    [mus appendString:@"\n"];
}
-(void)Show{
    NSLog(@"The Parts are: %@",mus);
}
@end
  • Builder類接口

1
2
3
4
5
6
7
8
#import <Foundation/Foundation.h>
                      
@class Product;
@interface Builder:NSObject
-(void)BuildPartA;
-(void)BuildPartB;
-(Product*)GetResult;
@end
  • Builder類實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import "Builder.h"
#import "Product.h"
                   
@implementation Builder
-(void)BuildPartA{
    return;
}
-(void)BuildPartB{
    return;
}
-(Product*)GetResult{
    return [[Product alloc]init];
}
@end
  • ConcreteBuilder1類接口

1
2
3
4
5
6
7
8
#import "Builder.h"
                 
@class Product;
@interface ConcreteBuilder1:Builder{
@private Product *pro;
}
-(ConcreteBuilder1*)MyInit;
@end
  • ConcreteBuilder1類實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#import "ConcreteBuilder1.h"
#import "Product.h"
               
@implementation ConcreteBuilder1
-(ConcreteBuilder1*)MyInit{
    pro= [[Product alloc]MyInit];
    return self;
}
-(void)BuildPartA{
    [pro Add:@"部件A"];
}
-(void)BuildPartB{
    [pro Add:@"部件B"];
}
-(Product*)GetResult{
   return pro;
}
@end
  • ConcreteBuilder2類接口

1
2
3
4
5
6
7
8
#import "Builder.h"
            
@class Product;
@interface ConcreteBuilder2:Builder{
@private Product *pro;
}
-(ConcreteBuilder2*)MyInit;
@end
  • ConcreteBuilder2類實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#import "ConcreteBuilder2.h"
#import "Product.h"
          
@implementation ConcreteBuilder2
-(ConcreteBuilder2*)MyInit{
   pro= [[Product alloc]MyInit];
   return self;
}
-(void)BuildPartA{
    [pro Add:@"部件X"];
}
-(void)BuildPartB{
    [pro Add:@"部件Y"];
}
-(Product*)GetResult{
   return pro;
}
@end
  • Director類接口

1
2
3
4
5
6
#import <Foundation/Foundation.h>
        
@class Builder;
@interface Director:NSObject
-(void)Construct:(Builder*)builder;
@end
  • Director類實現

1
2
3
4
5
6
7
8
9
#import "Director.h"
#import "Builder.h"
      
@implementation Director
-(void)Construct:(Builder*)builder{
    [builder    BuildPartA];
    [builder    BuildPartB];
}
@end
  • Main方法調用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#import <Foundation/Foundation.h>
#import "Director.h"
#import "ConcreteBuilder1.h"
#import "ConcreteBuilder2.h"
#import "Product.h"
    
int main(int argc,const char * argv[])
{
   @autoreleasepool{
    Director *director = [[Director alloc]init];
    Builder *b1 = [[ConcreteBuilder1 alloc]MyInit];
    Builder *b2 = [[ConcreteBuilder2 alloc]MyInit];
    [director Construct:b1];
    Product *p1 = [b1 GetResult];
    [p1 Show];  
    [director Construct:b2];
    Product *p2 = [b2 GetResult];
    [p2 Show];
    }
return 0;
}

   好啦,以上是類結構圖中所需要簡單實現的代碼。

   最後說一下,一般都什麼時候可能會用到建造者模式。一般來說,建造者模式主要用於創建一些複雜的對象,這些對象內部構建的建造順序通常是穩定的,但對象內部的構建通常面臨着複雜的變化,那麼建造者模式的好處就是使得建造代碼和表示代碼分離,由於建造者隱藏了該產品是如何組裝的,所以若需要改變一個產品的內部表示,只需要再定義一個具體的建造者就可以了。

發佈了37 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章