iOS设计模式之(五)生成器模式(建造模式)

本文首发于我的博客html

前言

什么是生成器模式

生成器模式 又名:建造模式 属于建立型模式,在wikipedia中的定义以下git

生成器模式(英:Builder Pattern)是一种设计模式,又名:建造模式,是一种对象构建模式。它能够将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不一样实现方法能够构造出不一样表现(属性)的对象。github

适用性

在如下状况使用生成器模式:算法

  • 当建立复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;
  • 当构造过程必须容许被构造的对象有不一样的表示时。

参与者

  • Builder 抽象建造者类
    • 为建立一个Product对象的各个部件指定抽象接口。
  • ConcreteBuilder 建造者类
    • 实现Builder的接口以构造和装配该产品的各个部件。
    • 定义并明确它所建立的表示。
    • 提供一个检索产品的接口
  • Director 导演类
    • 构造一个使用Builder接口的对象。
  • Product 产品类
    • 表示被构造的复杂对象。ConcreateBuilder建立该产品的内部表示并定义它的装配过程。
    • 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

代码

YZBuilderCar

建立YZBuilderCar类,有两个属性,分别是名字和价格设计模式

#import <Foundation/Foundation.h>


@interface YZBuilderCar : NSObject
@property (nonatomic,   strong)NSString *name;// 名字
@property (nonatomic, strong)NSString *price;// 价格

-(YZBuilderCar *)makeCar;
@end
复制代码

实现以下bash

#import "YZBuilderCar.h"

@interface YZBuilderCar()
@end


@implementation YZBuilderCar

- (NSString *)description{
    return [NSString stringWithFormat:@"我是一辆:%@ 车 价格:%@",self.name,self.price];
}

- (YZProductCar *)makeCar{
    YZBuilderCar *car = [[YZBuilderCar alloc] init];
    car.name = self.name;
    car.price = self.price;
    return  car;
}

@end
复制代码

YZBMWCarYZAudiCar继承自YZBuilderCar

建立车型YZBMWCar测试

#import "YZProductCar.h"


@interface YZBMWCar : YZBuilderCar

@end



#import "YZBMWCar.h"

@implementation YZBMWCar
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @"宝马740Li";
        self.price = @"98万";
    }
    return self;
}

@end


复制代码

建立车型YZAudiCarui

#import "YZProductCar.h"


@interface YZAudiCar : YZBuilderCar

@end


#import "YZAudiCar.h"

@implementation YZAudiCar
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.name = @"奥迪Q5";
        self.price = @"45万";
    }
    return self;
}

@end
复制代码

YZDirector

#import <Foundation/Foundation.h>

#import "YZBuilderCar.h"

@interface YZDirector : NSObject
// 建造一辆车
+ (YZProductCar *)creatBuickCar:(YZBuilderCar *)builder;
@end


#import "YZDirector.h"

@implementation YZDirector
+ (YZProductCar *)creatBuickCar:(YZBuilderCar *)builder{
    YZProductCar *car = [builder makeCar];
    return car;
}
@end


复制代码

使用

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        YZBuilderCar *car = [[YZBMWCar alloc] init];
        YZDirector *dir = [YZDirector creatBuickCar:car];
        NSLog(@"%@",dir.description);
        
    }
    return 0;
}
复制代码

输出为atom

我是一辆:宝马740Li 车 价格:98万spa

建造者模式的优势

首先,建造者模式的封装性很好。使用建造者模式能够有效的封装变化,在使用建造者模式的场景中,通常产品类和建造者类是比较稳定的,所以,将主要的业务逻辑封装在Director类中对总体而言能够取得比较好的稳定性。

其次,建造者模式很容易进行扩展。若是有新的需求,经过实现一个新的ConcreteBuilder类就能够完成,基本上不用修改以前已经测试经过的代码,所以也就不会对原有功能引入风险。

建造者模式与工厂模式的区别

咱们能够看到,建造者模式与工厂模式是极为类似的,整体上,建造者模式仅仅只比工厂模式多了一个"导演类"的角色。在建造者模式的类图中,假如把这个导演类看作是最终调用的客户端,那么图中剩余的部分就能够看做是一个简单的工厂模式了。

与工厂模式相比,建造者模式通常用来建立更为复杂的对象,由于对象的建立过程更为复杂,所以将对象的建立过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的所有建立过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类通常只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,而后将组建好的产品交付给客户端。

总结

建造者模式与工厂模式相似,他们都是建造者模式,适用的场景也很类似。通常来讲,若是产品的建造很复杂,那么请用工厂模式;若是产品的建造更复杂,那么请用建造者模式。

Demo地址

相关文章
相关标签/搜索