1.生成器模式的定義
將一個復雜的對象的構(gòu)件與它的表示分離周崭,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示
2.生成器模式的UML
Builder :生成器接口,定義創(chuàng)建一個Product各個部件的操作
ConcreteBuilder:具體的生成器的實現(xiàn)類
Product:產(chǎn)品,表示被生成器構(gòu)建的復雜的對象杀狡,包含多個部件
Director:指導者也稱導向者,主要用來使用Builder接口 ,已一個統(tǒng)一的接口創(chuàng)建Product對象
比如我們要生產(chǎn)一輛汽車, 簡單分為生產(chǎn)發(fā)動機, 輪子, 車門, 分別由發(fā)動機部門, 輪子部門, 車門部門分別負責生產(chǎn)
由生產(chǎn)調(diào)度中心調(diào)度, 并將3個部門的產(chǎn)品合成為一輛汽車
首先我們創(chuàng)建一個生產(chǎn)調(diào)度中心Build類負責調(diào)度其他生產(chǎn)部門, 這個時候需要給生產(chǎn)部門一個約束或者是協(xié)議, 比如部門要有統(tǒng)一的生產(chǎn)方法
然后我們以接口的形式創(chuàng)建各個部門的抽象接口
AbstractEngineProtocol.h
#import <Foundation/Foundation.h>
#import <UIKit/UIkit.h>
@protocol AbstractEngineProtocol <NSObject>
@required
/**
設置發(fā)動機尺寸
@param scale 尺寸大小
*/
- (void)engineScale:(CGFloat)scale;
/**
設置發(fā)動機重量
@param height 發(fā)動機重量
*/
- (void)engineWeight:(CGFloat)height;
/**
獲取發(fā)動機信息
@return 返回發(fā)動機信息
*/
- (NSString *)information;
@end
AbstractWheelProtocol.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol AbstractWheelProtocol <NSObject>
@required
/**
設置輪子個數(shù)
@param number 個數(shù)
*/
- (void)wheelNumber:(CGFloat)number;
/**
返回輪子信息
@return 輪子信息
*/
- (NSString *)information;
@end
AbstractDoorProtocol.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol AbstractDoorProtocol <NSObject>
@required
/**
設置門的數(shù)量
@param number 數(shù)量
*/
- (void)doorNumber:(CGFloat)number;
/**
返回車門的信息
@return 車門信息
*/
- (NSString *)information;
@end
BuildProtocal.h
#import <Foundation/Foundation.h>
@protocol BuildProtocal <NSObject>
@required
/**
生產(chǎn)部件
@return 返回部件
*/
- (id)build;
@end
Builder.h
#import <Foundation/Foundation.h>
#import "AbstractDoorProtocol.h"
#import "AbstractWheelProtocol.h"
#import "AbstractEngineProtocol.h"
#import "BuildProtocal.h"
@interface Builder : NSObject
@property (nonatomic, strong) id <BuildProtocal, AbstractEngineProtocol> engine;
@property (nonatomic, strong) id <BuildProtocal, AbstractWheelProtocol> wheel;
@property (nonatomic, strong) id <BuildProtocal, AbstractDoorProtocol> door;
/**
產(chǎn)品信息
*/
@property (nonatomic, strong) NSDictionary *productInfo;
/**
構(gòu)建所有部件
@return 返回產(chǎn)品
*/
- (id)buildAllParts;
@end
Builder.m
#import "Builder.h"
@implementation Builder
- (id)buildAllParts {
//創(chuàng)建部件
[self.engine build];
[self.wheel build];
[self.door build];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
//組裝產(chǎn)品
dict[@"engine"] = [self.engine information];
dict[@"wheel"] = [self.wheel information];
dict[@"door"] = [self.door information];
self.productInfo = dict;
return self;
}
@end
接下來我們創(chuàng)建各個部門的類, 他們實現(xiàn)部門抽象接口的同時還要遵循調(diào)度中心的約束, 實現(xiàn)調(diào)度中心的接口
BMWEngine.h
#import <Foundation/Foundation.h>
#import "AbstractEngineProtocol.h"
#import "BuildProtocal.h"
@interface BMWEngine : NSObject <AbstractEngineProtocol, BuildProtocal>
@end
BMWEngine.m
#import "BMWEngine.h"
@implementation BMWEngine
#pragma mark - AbstractEngineProtocol methods
- (void)engineScale:(CGFloat)scale {
//to do
}
- (void)engineWeight:(CGFloat)height {
//to do
}
- (NSString *)information {
return @"BMW Engine, Scale: 10, Height: 100kg";
}
#pragma mark - BuildProtocol method
- (id)build {
return [BMWEngine new];
}
@end
MIQIWheel.h
#import <Foundation/Foundation.h>
#import "BuildProtocal.h"
#import "AbstractWheelProtocol.h"
@interface MIQIWheel : NSObject <BuildProtocal, AbstractWheelProtocol>
@end
MIQIWheel.m
#import "MIQIWheel.h"
@implementation MIQIWheel
#pragma mark - AbstractWheelProtocol methods
- (void)wheelNumber:(CGFloat)number {
//to do
}
- (NSString *)information {
return @"MIQI Wheel, number: 4";
}
#pragma mark - BuildProtocol method
- (id)build {
return [MIQIWheel new];
}
@end
BMWDoor.h
#import <Foundation/Foundation.h>
#import "BuildProtocal.h"
#import "AbstractDoorProtocol.h"
@interface BMWDoor : NSObject <BuildProtocal, AbstractDoorProtocol>
@end
BMWDoor.m
#import "BMWDoor.h"
@implementation BMWDoor
#pragma mark - AbstractDoorProtocol methods
- (void)doorNumber:(CGFloat)number {
//to do
}
- (NSString *)information {
return @"BMW Door, number: 4";
}
#pragma mark - BuildProtocol method
- (id)build {
return [BMWDoor new];
}
@end
下面是在Controller中實現(xiàn)
#import "ViewController.h"
#import "Builder.h"
#import "BMWEngine.h"
#import "BMWDoor.h"
#import "MIQIWheel.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//創(chuàng)建一個建造調(diào)控中心
Builder *builder = [[Builder alloc] init];
//配置生產(chǎn)組件單位
builder.engine = [[BMWEngine alloc] init];
builder.wheel = [[MIQIWheel alloc] init];
builder.door = [[BMWDoor alloc] init];
//生產(chǎn)
id product = [builder buildAllParts];
//打印產(chǎn)品信息
NSLog(@"%@", [product productInfo]);
}
@end