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:指揮者 讀