ios-建造者模式

506 阅读3分钟
  • 1、建造者模式的定义 将复杂对象的构建和表示分离开,使得相同的构建顺序可以实现不同的表示
  • 2、建造者模式的实现要点
  • 3、应用场景
    多个部件或零件,都可以装配到一个对象中(某个类的构造函数入参多于3个,且包含可选参数)
  • 相同的方法,不同的执行顺序,会产生不同的结果
  • 1.举例一个人分为头、身体、手、脚,
  • 2.当我们要创建一个胖子和一个瘦子的时候需要创建一个人类,在里面创建一个头、身体、手、脚。
  • 3.但是胖子很瘦子又有各自的特点不同,创建不一样的身体,一个大肚子一个小肚子。所以要分为胖子类和瘦子类。所以基于人类,分两个子类。
  • 4.但是两个子类中需要创建头、身体、手、脚,代码还是很多。
  • 5.我们能不能把头、身体、手、脚各自拆分为类,创建的过程就在各自类中完成,而不是在胖子、瘦子类中完成减少了,胖子瘦子类的代码量。同时可以胖子和瘦子中各自完成对他们头、身体、手、脚的不同的装饰呢。
  • 总结建造者模式其实就是讲一个很复杂的类拆分成各个零件类之后加以组装。所以当遇到一个设计多个很复杂的页面View,但是这些View有相同的元素又有不同的元素的时候可以用构造。将这些元素分别建为子类然后重新组装起来。
  • 定义一个代理用于定义一些创建方法
#import <Foundation/Foundation.h>

//typedef  NS_ENUM(NSUInteger,BuildOption){
//    BuildFat,
//    BuildThin
//};



@protocol HCDPresionBuilder <NSObject>

-(void)buildHead;
-(void)buildBody;
-(void)buildArmLeft;
-(void)buildArmRight;
-(void)buildLegLeft;
-(void)buildLegRight;

- (void)buildPerson;

@end

typedef id<HCDPresionBuilder> HCDPresionBuilder;

  • 定义一个瘦子类
#import <Foundation/Foundation.h>
#import "HCDPresionBuilder.h"

@interface HCDPersonThinBuilder : NSObject<HCDPresionBuilder>

@end

#import "HCDPersonThinBuilder.h"
#import "HCDHeader.h"
#import "HCDBody.h"
#import "HCDLeg.h"
#import "HCDArm.h"


@interface HCDPersonThinBuilder()
@property(nonatomic, strong)HCDHeader *header;
@property(nonatomic, strong)HCDBody *body;
@property(nonatomic, strong)HCDLeg *leg;
@property(nonatomic, strong)HCDArm *arm;
@end

@implementation HCDPersonThinBuilder


-(instancetype)init{
    self = [super init];
    if (self) {
        _header = [[HCDHeader alloc]init];
        _body = [[HCDBody alloc]init];
        _leg = [[HCDLeg alloc]init];
        _arm = [[HCDArm alloc]init];
    }
    return self;
}

-(void)buildPerson{
    [self buildHead];
    [self buildBody];
    [self buildArmLeft];
    [self buildArmRight];
    [self buildLegLeft];
    [self buildLegRight];
}

- (void)buildHead {
    NSLog(@"建造瘦子的头部");
    [self.header work];
}

- (void)buildBody {
    NSLog(@"建造瘦子的身体");
     [self.body work];
}

- (void)buildArmLeft {
    NSLog(@"建造瘦子的左手");
     [self.arm work];
}

- (void)buildArmRight {
    NSLog(@"建造瘦子的右手");
     [self.arm work];
}

- (void)buildLegLeft {
    NSLog(@"建造瘦子的左脚");
     [self.leg work];
}

- (void)buildLegRight {
    NSLog(@"建造瘦子的右脚");
    [self.leg work];
}


@end
  • 定义一个胖子类
#import <Foundation/Foundation.h>
#import "HCDPresionBuilder.h"

@interface HCDPersonFatBuilder : NSObject<HCDPresionBuilder>

@end

#import "HCDPersonFatBuilder.h"
#import "HCDHeader.h"
#import "HCDBody.h"
#import "HCDLeg.h"
#import "HCDArm.h"


@interface HCDPersonFatBuilder()
@property(nonatomic, strong)HCDHeader *header;
@property(nonatomic, strong)HCDBody *body;
@property(nonatomic, strong)HCDLeg *leg;
@property(nonatomic, strong)HCDArm *arm;
@end
@implementation HCDPersonFatBuilder

-(instancetype)init{
    self = [super init];
    if (self) {
        _header = [[HCDHeader alloc]init];
        _body = [[HCDBody alloc]init];
        _leg = [[HCDLeg alloc]init];
        _arm = [[HCDArm alloc]init];
    }
    return self;
}

-(void)buildPerson{
    [self buildHead];
    [self buildBody];
    [self buildArmLeft];
    [self buildArmRight];
    [self buildLegLeft];
    [self buildLegRight];
}

- (void)buildHead {
    NSLog(@"建造胖子的头部");
    [self.header work];
}

- (void)buildBody {
    NSLog(@"建造胖子的身体");
    [self.body work];
}

- (void)buildArmLeft {
    NSLog(@"建造胖子的左手");
    [self.arm work];
}

- (void)buildArmRight {
    NSLog(@"建造胖子的右手");
    [self.arm work];
}

- (void)buildLegLeft {
    NSLog(@"建造胖子的左脚");
    [self.leg work];
}

- (void)buildLegRight {
    NSLog(@"建造胖子的右脚");
    [self.leg work];
}
@end

  • 定义一个建筑指令类,传入胖子或瘦子的实例对象,调用方法后调用类实例对象的实例方法。(可写可不写吧),写了感觉清晰一些而已
#import <Foundation/Foundation.h>
#import "HCDPresionBuilder.h"

@interface HCDPersonBuilderDirector : NSObject


@property(nonatomic, strong)HCDPresionBuilder builder;

-(void)buildPerson;

@end

#import "HCDPersonBuilderDirector.h"
#import "HCDPersonFatBuilder.h"
#import "HCDPersonThinBuilder.h"


@interface HCDPersonBuilderDirector ()

@end

@implementation HCDPersonBuilderDirector


-(void)buildPerson{
    NSLog(@"===============director指挥builder开始建造====================");
    [self.builder buildPerson];
}

@end

#import <Foundation/Foundation.h>

@interface HCDHeader : NSObject

-(void)work;

@end

#import "HCDHeader.h"

@implementation HCDHeader

-(void)work{
    NSLog(@"成功构建了头-----HCDHead");
}

@end
  • 身体
#import <Foundation/Foundation.h>

@interface HCDBody : NSObject

-(void)work;

@end

#import "HCDBody.h"

@implementation HCDBody

-(void)work{
    NSLog(@"成功构建了身体-----HCDBody");
}

@end
#import <Foundation/Foundation.h>

@interface HCDLeg : NSObject

-(void)work;

@end

#import "HCDLeg.h"

@implementation HCDLeg

-(void)work{
    NSLog(@"成功构建了腿------HCDLeg");
}

@end

#import <Foundation/Foundation.h>

@interface HCDArm : NSObject

-(void)work;

@end

#import "HCDArm.h"

@implementation HCDArm

-(void)work{
    NSLog(@"成功构建了手臂------HCDArm");
}

@end

  • 调用
- (IBAction)buildFat:(id)sender {
    HCDPersonBuilderDirector *director = [[HCDPersonBuilderDirector alloc]init];
    HCDPresionBuilder builder = [[HCDPersonFatBuilder alloc]init];
    //为director指定builder
    director.builder = builder;
    //director发出构建的指令,builder负责具体的建造过程
    [director buildPerson];
}

- (IBAction)buildThin:(id)sender {
    
    HCDPersonBuilderDirector *director = [[HCDPersonBuilderDirector alloc]init];
    HCDPresionBuilder builder = [[HCDPersonThinBuilder alloc]init];
    //为director指定builder
    director.builder = builder;
    //director发出构建的指令,builder负责具体的建造过程
    [director buildPerson];
}