1. 程式人生 > >iOS架構師_構建者模式

iOS架構師_構建者模式

概述

其核心思想是將一個“複雜物件的構建演算法”與它的“部件及組裝方式”分離,使得構件演算法和組裝方式可以獨立應對變化;複用同樣的構建演算法可以建立不同的表示,不同的構建過程可以複用相同的部件組裝方式。

主要優缺點

在建立者模式中,客戶端不再負責物件的建立與組裝,而是把這個物件建立的責任交給其具體的建立者類,把組裝的責任交給組裝類,客戶端只負責物件的呼叫,從而明確了各個類的職責。
雖然利用建立者模式可以創建出不同型別的產品,但是如果產品之間的差異巨大,則需要編寫多個建立者類才能實現,如果這是結合工廠模式更好。

建立者模式主要由五個部分構成:組裝類,抽象建立者類,實現抽象建立者類的具體建立者類,抽象產品和實現抽象產品的具體產品類。

這裡寫圖片描述

UML圖

這裡寫圖片描述

時序圖
這裡寫圖片描述

程式碼示例:

建立構建者協議類Builder

#import <Foundation/Foundation.h>

// 構建者
@protocol Builder <NSObject>

// 構建部分
- (NSString *)builderPart;
@end

建立具體生成者類ConcreteBuild
ConcreteBuild.h

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

@interface ConcreteBuild : NSObject
<Builder>
@end

ConcreteBuild.m

#import "ConcreteBuild.h"

@implementation ConcreteBuild

#pragma mark - Builder
- (NSString *)builderPart {
    return @"實現協議, 返回產品";
}
@end

建立組裝者類Director

Director.h

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

@interface Director : NSObject
// 建立傳入的實現者 - (instancetype)initWithBuilder:(id<Builder>)builder; // 建造 - (NSString *)construct; @end

Director.m

#import "Director.h"

@interface Director ()
@property (nonatomic, copy) id<Builder> builder;
@end

@implementation Director
- (instancetype)initWithBuilder:(id<Builder>)builder {
    self = [super init];
    if (self) {
        _builder = builder;
    }
    return self;
}

// 建造
- (NSString *)construct {
    // 建立部件
    return [self.builder builderPart];
}
@end

ViewController呼叫


#import "ViewController.h"
#import "Director.h"
#import "ConcreteBuild.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 1.建立生成者, 知道要做的產品
    ConcreteBuild *build = [[ConcreteBuild alloc] init];
    NSString *str2 = [build builderPart];

    // 2.建立承包商
    Director *director = [[Director alloc] initWithBuilder:build];

    // 3.交付產品
    NSString *str = [director construct];
    NSLog(@"str = %@, str2 = %@",str, str2);

}

@end

使用構建者模式的需求:

客戶要店主一臺蘋果電腦, 電腦有CPU 顯示卡 主機板 系統
組裝者(指導者): 店主(Director)
構建者: 蘋果電腦
(協議) 生成者: CPU 顯示卡 主機板 系統

UML圖
這裡寫圖片描述

Demo2
拓展生成者來處理最後的結構

首先建立協議類MacBuilder(生成者)

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

@protocol MacBuilder <NSObject>

// 構建CPU
- (id<MacBuilder>)buildCPU:(NSString *)cpu;

// 構建顯示卡
- (id<MacBuilder>)buildDisplay:(NSString *)display;

// 構建主機板
- (id<MacBuilder>)buildMainboard:(NSString *)mainboard;

// 構建系統
- (id<MacBuilder>)buildOS:(NSString *)os;

// 構建
- (id<MacComputerProtocol>)build;

@end

建立協議MacComputerProtocol

#import <Foundation/Foundation.h>

@protocol MacComputerProtocol <NSObject>

// 處理器
- (void)cpu:(NSString *)cpu;

// 顯示卡
- (void)display:(NSString *)display;

// 主機板
- (void)mainboard:(NSString *)mainboard;

// 系統
- (void)os;

@end

建立MacComputerBuilder類(構建者)

MacComputerBuilder.h

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

@interface MacComputerBuilder : NSObject <MacBuilder>

@end

MacComputerBuilder.m

#import "MacComputerBuilder.h"
#import "MACComputer.h"

@interface MacComputerBuilder ()
@property (nonatomic, strong) id<MacComputerProtocol> computer;
@end

// 類似的呼叫方式, 就是典型的構建者呼叫模式
@implementation MacComputerBuilder

- (instancetype)init
{
    self = [super init];
    if (self) {
        _computer = [[MACComputer alloc] init];
    }
    return self;
}

// 構建CPU
- (id<MacBuilder>)buildCPU:(NSString *)cpu {
    [_computer cpu:cpu];
    return self;
}

// 構建顯示卡
- (id<MacBuilder>)buildDisplay:(NSString *)display {
    [_computer display:display];
    return self;
}

// 構建主機板
- (id<MacBuilder>)buildMainboard:(NSString *)mainboard {
    [_computer mainboard:mainboard];
    return self;
}

// 構建系統
- (id<MacBuilder>)buildOS:(NSString *)os {
    [_computer os];
    return self;
}

// 構建
- (id<MacComputerProtocol>)build {
    NSLog(@"構建了一臺蘋果電腦");
    //這種中間其實有很多邏輯需要處理,此次省略500行程式碼

    return _computer;
}
@end

建立MACComputer類
MACComputer.h

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

@interface MACComputer : NSObject <MacComputerProtocol>

@end

MACComputer.m

#import "MACComputer.h"

@implementation MACComputer
// 處理器
- (void)cpu:(NSString *)cpu {
    NSLog(@"Mac電腦處理器:%@",cpu);
}

// 顯示卡
- (void)display:(NSString *)display {
    NSLog(@"Mac電腦顯示卡:%@",display);
}

// 主機板
- (void)mainboard:(NSString *)mainboard {
    NSLog(@"Mac電腦主機板:%@",mainboard);

}

// 系統
- (void)os {
    NSLog(@"MAC系統");
}
@end

建立組裝者Director類

Director.h

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

// 組裝
@interface Director : NSObject
- (instancetype)initWithBuilder:(id<MacBuilder>)builder;

// 成品的方法
- (void)constructCPU:(NSString *)cpu display:(NSString *)display mainboard:(NSString *)mainboard;

@end

Director.m

#import "Director.h"

@interface Director ()
@property (nonatomic, strong) id<MacBuilder> builder;
@end

@implementation Director
- (instancetype)initWithBuilder:(id<MacBuilder>)builder {
    self = [super init];
    if (self) {
        _builder = builder;
    }
    return self;
}

// 成品的方法
- (void)constructCPU:(NSString *)cpu display:(NSString *)display mainboard:(NSString *)mainboard {

    [[[[_builder buildCPU:cpu] buildDisplay:display] buildMainboard:mainboard] build];
}

@end

ViewController呼叫

#import "ViewController.h"
#import "Director.h"
#import "MacComputerBuilder.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 第一種構建方式
//    id<MacBuilder> build = [[MacComputerBuilder alloc] init];
//    // 構建者
//    Director *director = [[Director alloc] initWithBuilder:build];
//    [director constructCPU:@"Intel i8" display:@"獨立顯示卡" mainboard:@"超級主機板"];

    // 第二種方式
    id<MacBuilder> build = [[MacComputerBuilder alloc] init];
    // 構建者
    id<MacComputerProtocol> com = [[[[build buildCPU:@"Intel i8"] buildDisplay:@"du li xian ka"] buildMainboard:@"zhu ban"] build];
    NSLog(@"com = %@", com);

}

@end

實際開發中應用Demo

構建者模式變體
這裡寫圖片描述

首先建立DrawBuilder類,再建立DrawView類
DrawView.h

#import <UIKit/UIKit.h>

@interface DrawView : UIView

@property (nonatomic, assign) CGFloat buildLabel;
@property (nonatomic, assign) CGFloat buildButton;
@property (nonatomic, assign) CGFloat buildSizeView;

@end

DrawView.m

#import "DrawView.h"

@implementation DrawView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame: frame];
    if (self) {
        self.backgroundColor = [UIColor grayColor];
    }
    return self;
}

// 使用drawRect,可以在控制器中設定值給view.
- (void)drawRect:(CGRect)rect {

    [self setBackgroundColor:[UIColor redColor]];
    // label
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(self.buildLabel, 100, 50, 80)];
    label.text = @"TZ";
    label.textAlignment = NSTextAlignmentCenter;
    label.textColor = [UIColor blackColor];
    [self addSubview:label];

    // 按鈕
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, self.buildButton, 100, 50)];
    [btn setTitle:@"藍色" forState:UIControlStateNormal];
    btn.titleLabel.backgroundColor = [UIColor redColor];
    btn.titleLabel.textAlignment = NSTextAlignmentCenter;
    [self addSubview:btn];

    // 新增view
    UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(100, 200, 100, self.buildSizeView)];
    subView.backgroundColor = [UIColor blueColor];
    [self addSubview:subView];

    UIImage *backgroundImage = [UIImage imageNamed:@"tupian"];
    UIImageView *backgroundView = [[UIImageView alloc] initWithImage:backgroundImage];

    [self addSubview:backgroundView];
}

@end

DrawBuilder.h

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

@interface DrawBuilder : NSObject

- (CGFloat)buildLabel;  /**< 構建label */
- (CGFloat)buildButton; /**< 構建按鈕 */
- (CGFloat)buildSizeView; /**< 構建藍色的View */

- (DrawView *)loadView; /**< 構建結果 */

@end

DrawBuilder.m

#import "DrawBuilder.h"

@implementation DrawBuilder
- (CGFloat)buildLabel {
    return 0;
}

- (CGFloat)buildButton {
    return 0;
}

- (CGFloat)buildSizeView {
    return 0;
}

- (DrawView *)loadView {
    CGFloat drawWidth = 200;
    CGFloat drawHeight = 300;

    DrawView *drawView = [[DrawView alloc] initWithFrame:CGRectMake(0, 0, drawWidth, drawHeight)];

    //
    drawView.buildLabel = [self buildLabel];
    drawView.buildButton = [self buildButton];
    drawView.buildSizeView = [self buildSizeView];

    return drawView;
}

@end

建立繼承自DrawBuilder類的DrawSubBuilderOne和DrawSubBuilderTeo

DrawSubBuilderOne.m

#import "DrawSubBuilderOne.h"

@implementation DrawSubBuilderOne
- (CGFloat)buildLabel {
    return 1;
}

- (CGFloat)buildButton {
    return 1;
}

- (CGFloat)buildSizeView {
    return 1;
}
@end

DrawSubBuilderTeo.m

#import "DrawSubBuilderTeo.h"

@implementation DrawSubBuilderTeo
- (CGFloat)buildLabel {
    return 10;
}

- (CGFloat)buildButton {
    return 150;
}

- (CGFloat)buildSizeView {
    return 100;
}
@end

建立Director組裝者
Director.h

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

@interface Director : NSObject

+ (DrawView *)creatView:(DrawBuilder *)builder;

@end

Director.m

#import "Director.h"

@implementation Director

+ (DrawView *)creatView:(DrawBuilder *)builder {
    DrawView *drawView = [builder loadView];
    return drawView;
}
@end

ViewController呼叫

#import "ViewController.h"
#import "DrawSubBuilderOne.h"
#import "DrawSubBuilderTeo.h"
#import "Director.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)btnClick:(id)sender {
    // 建立者
//    DrawBuilder *builder = [[DrawSubBuilderOne alloc] init];
    DrawBuilder *builder = [[DrawSubBuilderTeo alloc] init];

    // 組裝
    DrawView *drawView = [Director creatView:builder];

    drawView.center = self.view.center;
    [self.view addSubview:drawView];
}


@end

這裡寫圖片描述

相關推薦

iOS架構_構建模式

概述 其核心思想是將一個“複雜物件的構建演算法”與它的“部件及組裝方式”分離,使得構件演算法和組裝方式可以獨立應對變化;複用同樣的構建演算法可以建立不同的表示,不同的構建過程可以複用相同的部件組裝方式。 主要優缺點 在建立者模式中,客戶端不再負責物件的

iOS架構_工廠模式

簡單工廠: 例子: 模式圖 程式碼示例: 建立水果工廠類FruitsFactory 再建立水果類Fruits,以及Fruits的子類Apple,Orange,Banana FruitsFactory.h #import <Foun

IOS設計架構模式構建模式和中介模式

一、構建者模式        什麼是構建者模式?        將一個“複雜物件的構建演算法”與它的“部件及組裝方式”分離,使得構建演算法和組裝方式可以獨立應對變化;複用同樣的構建演算法可以建立不同的表示,不同的構建過程可以複用相同的部件組裝方式。        比

設計模式_中介模式

normal args current auto 管理 override prompt 耦合 小系統 定義 Define an object that encapsulates how a set of objects interact. Mediator pro

事件(_觀察模式

collect cti threading 發布 adk names [] 委托 mouse 一個類如果聲明一個Public的委托讓其他方法註冊,同樣也會存在外部直接調用此委托,這樣是有會出現莫名的調用風險的。因此就有了事件,事件無法在外部直接調用。外部只有註冊(定閱)。內

09.設計模式_裝飾模式

9.png 組件 復雜 2-2 就會 蘋果手機 apple pat 轉載 轉載自 http://www.cnblogs.com/zhili/p/DecoratorPattern.html 一、引言 在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給手機添加貼膜

構建模式-Builder

接口 lose builder str 參數 his 控制 它的 tostring 構建者模式-Builder Builder模式是一步一步創建一個復雜對象的創建型模式,它允許用戶在不知道內部構建細節的情況下,可以更精細地控制對象的構造流程。該模式是為了將構建復雜對象的過

7年iOS架構-- 告訴你堅持寫博客對我們有什麽好處

復雜 來講 同事 寫作 也快 真的 tps 架構圖 提高自己 一,寫博客的擔心 1.今天來談談,寫博客對我的益處,說起寫博客,其實我寫博客的時間不長,也就10來個月時間; 2.之前工作的時候,看到同事每天晚上寫博客,當時覺得很奇怪,就覺得寫這個東西,非常浪費時間, 3.自己

6年iOS架構告訴你程序員到底有沒有前途?【頭條熱門】

所有 成長 更多 通過 什麽 光環 溝通 大學 就是 前言: 1,早上到公司,看昨天晚上QQ群裏的內容,有人在問做iOS程序員怎麽樣。馬上就有人跳出來告訴他程序員又苦、又累,要求又高、賺得也不比人多,而且30歲以後肯定失業那一套。對程序員的前途,自己有自己的想法,但這沒什麽

7年iOS架構教你如何快速提高並掌握 iOS開發核心技能

應該 ava col block 架構師 就是 深入 board 對象 前言: 首先你要花點時間針對objective-c語言的學習;畢竟這個是iOS開發的基礎(你也可以嘗試用Swift,但此項目只是針對OC),編程套路其實都是差不多,多寫多想多實踐;關於環境的搭建就不在本

設計模式 _第八招式_中介模式

一、定義 用一箇中介物件封裝一系列的的物件的互動,中介者使各物件不需要相互引用,從而降低耦合性,且可以獨立地改變他們之間的互動。 二、程式碼演示 2.1 uml類圖 2.2 Mediator抽象中介者角色 抽象中介角色定義統一的介面,使用者是各同事角色之間通訊。 pub

設計模式 _第五招式_建造模式

一、定義 建造者模式(Builder Pattern)叫做生成器模式,將一個複雜物件的構建與它表示分離,使得同樣的構造過程可以建立不同的表示,可以按照部件屬性有序的建立物件。 二、程式碼演示 建造者模式通用類圖 Product產品類 通常是實現了模版方法模

iOS-知識梳理(觀察模式-KVO、NSNotification的實現原理.KVC原理)

觀察者模式的定義:一個目標物件管理所有依賴於它的觀察者物件,並在它自身的狀態改變時主動通知觀察者物件。這個主動通知通常是通過呼叫各觀察者物件所提供的介面方法來實現的。觀察者模式較完美地將目標物件與觀察者物件解耦。 KVO基於runtime實現,當你觀察一個物件的時候,一個新類被動態建立繼承於

設計模式-建立型-構建模式

基本概念: 構建者模式的定義 將構建的過程和表示過程進行分離 構建的過程:隱藏 表示過程 : 開放 構建者模式的場景 建立一個複雜的物件,同時改複雜物件有很多預設值(初始化)的時候,可以使用構建者模式。(典型:給物件設定可選引數) 構建者模式案例 Alr

一個在職八年的iOS架構,細看iOS開發的浮浮沉沉

移動網際網路行業就如是在海里船,浮浮沉沉,導致應用開發行業也是這樣。小編結合多年來的經驗細看iOS開發的情況,發現它和網際網路也同步,但是總體來說還是比較穩定,能獲得大多數使用者的歡心。   作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,我有一個千人的

iOS-知識梳理(觀察模式-KVO、NSNotification的實現原理)

觀察者模式的定義:一個目標物件管理所有依賴於它的觀察者物件,並在它自身的狀態改變時主動通知觀察者物件。這個主動通知通常是通過呼叫各觀察者物件所提供的介面方法來實現的。觀察者模式較完美地將目標物件與觀察者物件解耦。 KVO基於runtime實現,當你觀察一個物件的時候,一個新

阿里資深架構解析python-訪問者模式

訪問者模式 訪問者模式,是行為型設計模式之一。訪問者模式是一種將資料操作與資料結構分離的設計模式,它可以算是 23 中設計模式中最複雜的一個,但它的使用頻率並不是很高,大多數情況下,你並不需要使用訪問者模式,但是當你一旦需要使用它時,那你就是需要使用它了。 訪問者模式的基本

百度T8架構解析python-訪問者模式

訪問者模式 訪問者模式,是行為型設計模式之一。訪問者模式是一種將資料操作與資料結構分離的設計模式,它可以算是 23 中設計模式中最複雜的一個,但它的使用頻率並不是很高,大多數情況下,你並不需要使用訪問者模式,但是當你一旦需要使用它時,那你就是需要使用它了。 訪問者模式的基本想法是,軟體系統中擁有一個由許多物

設計模式 -> 構建模式Builder

在swagger,shiro等原始碼中構建者模式使用非常普及,以例子驅動 package test; /** * 構建者模式 * * 避免getter,setter程式碼冗雜 * 避免參數條件配置數量導致的含參構造程式碼冗雜 * @author Nf

設計模式go語言實現----構建模式Builder

1 概念 構建者模式定義: 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示 構建者模式包含如下角色: Product:具體產品 ConcreteBuilder:具體建造者 Builder:抽象建造者 Director:指揮者 讀