zoukankan      html  css  js  c++  java
  • Objective-C设计模式——生成器Builder(对象创建)

    生成器

    生成器,也成为建造者模式,同样是创建对象时的设计模式。该模式下有一个Director(指挥者),客户端知道该类引用用来创建产品。还有一个Builder(建造者),建造者知道具体创建对象的细节。

    指挥者只是起到协调的作用,它有一个Builder引用用于指挥Builder如何创建对象,Builder内就是为了构建对象的算法。

    其实生成器模式,就是为了定制某些特定对象而产生的模式。对象的过长往往非常的复杂,如果不是用该模式来创建对象,对象创建类将会非常的冗余且难以复用。使用生成器将表现层和创建层分离更加易于扩展和解耦。

    使用场景

    1.需要创建涉及各种部件的复杂对象。创建对象的算法应该独立于部件的装配方式。常见的例子是构建组合对象。

    2.构建过程需要以不同的方式(例如,部件或表现的不同组合)构建对象。

    生成器与抽象工厂对比

    生成器

    构建复杂对象

    以多个步骤构建对象

    在构建对象过程的最后一步返回产品

    专注于一个特定产品

    抽象工厂

    构建简单或复杂对象

    以单一步骤构建对象

    以单一方式构建对象

    立刻返回产品

    强调一套产品

    Demo

    比如汽车制造厂需要制造两种不同的汽车:

    首相创建Car类,有name和speed两个属性

    #import <Foundation/Foundation.h>
    
    @interface Car : NSObject
    
    @property(nonatomic, strong)NSString *name;
    
    @property(nonatomic ,assign)int speed;
    
    @end
    
    #import "Car.h"
    
    @implementation Car
    
    @end

    创建Builder,Builder封装了创建类的具体细节

    #import <Foundation/Foundation.h>
    #import "Car.h"
    
    @interface CarBuilder : NSObject
    
    -(CarBuilder *)buildCar;
    -(CarBuilder *)buildCarName;
    -(CarBuilder *)buildCarSpeed;
    -(Car *)getProduct;
    
    
    @end
    
    #import "CarBuilder.h"
    
    @implementation CarBuilder
    {
        Car *_product;
    
    }
    -(CarBuilder *)buildCar
    {
        _product =  nil;
        _product = [Car new];
        return self;
    }
    
    
    -(CarBuilder *)buildCarName
    {
        _product.name = @"benz";
        return self;
    }
    
    
    -(CarBuilder *)buildCarSpeed
    {
        _product.speed = 100;
        return self;
    }
    
    @end

    具体的Builder类:

    #import <Foundation/Foundation.h>
    #import "CarBuilder.h"
    
    @interface CarBuilderBenz : CarBuilder
    
    @end
    
    #import "CarBuilderBenz.h"
    
    @implementation CarBuilderBenz
    {
        Car *_product;
    }
    
    -(CarBuilder *)buildCar
    {
        _product =  nil;
        _product = [Car new];
        return self;
    }
    
    
    -(CarBuilder *)buildCarName
    {
        _product.name = @"benz";
        return self;
    }
    
    
    -(CarBuilder *)buildCarSpeed
    {
        _product.speed = 100;
        return self;
    }
    
    -(Car *)getProduct
    {
        return _product;
    }
    
    @end
    
    #import <Foundation/Foundation.h>
    #import "CarBuilder.h"
    @interface CarBuilderBMW : CarBuilder
    
    @end
    
    #import "CarBuilderBMW.h"
    
    @implementation CarBuilderBMW
    {
        Car *_product;
    }
    
    -(CarBuilder *)buildCar
    {
        _product =  nil;
        _product = [Car new];
        return self;
    }
    
    
    -(CarBuilder *)buildCarName
    {
        _product.name = @"BMW";
        return self;
    }
    
    
    -(CarBuilder *)buildCarSpeed
    {
        _product.speed = 120;
        return self;
    }
    
    -(Car *)getProduct
    {
        return _product;
    }
    @end

    Director类,Director知道生产产品,但并不知道具体生产细节。

    #import <Foundation/Foundation.h>
    #import "CarBuilder.h"
    #import "Car.h"
    
    @interface CarDirector : NSObject
    
    -(Car *)createCarBenz:(CarBuilder *)builder;
    -(Car *)createCarBMW:(CarBuilder *)builder;
    
    @end
    
    #import "CarDirector.h"
    
    @implementation CarDirector
    
    -(Car *)createCarBenz:(CarBuilder *)builder
    {
        [builder buildCar];
        [builder buildCarName];
        [builder buildCarSpeed];
        return [builder getProduct];
    }
    
    -(Car *)createCarBMW:(CarBuilder *)builder
    {
        [builder buildCar];
        [builder buildCarName];
        [builder buildCarSpeed];
        return [builder getProduct];
    }
    
    @end

    客户端代码:

            CarDirector *director = [CarDirector new];
            CarBuilderBenz *benzBuilder = [CarBuilderBenz new];
            CarBuilderBMW *BMWBuilder = [CarBuilderBMW new];
            Car *benz = [director createCarBenz:benzBuilder];
            Car *bmw = [director createCarBMW:BMWBuilder];
            NSLog(@"benz: name = %@ ,speed = %d",benz.name ,benz.speed);
            NSLog(@"BMW: name = %@ ,speed = %d",bmw.name ,bmw.speed);

    结果:

    2015-07-21 09:15:04.298 Builder[41745:10008190] benz: name = benz ,speed = 100
    2015-07-21 09:15:04.298 Builder[41745:10008190] BMW: name = BMW ,speed = 120

    可以看到,不同的builder封装不同的创建对象逻辑,产生不同的对象,同时分离了创建层和表示层。

  • 相关阅读:
    activiti基础二
    activiti基础一
    sql中between包含边界值吗?
    Mybatis遍历list,Array,map
    元祖变成字符串 || 字符串中替换部分字符串 || enumberate可以找到字符串,列表,元祖的的索引和值 || zip的用法 || 判断变量的类型
    py怎样建立模块和怎样导入模块
    怎样判断变量是数组?
    oracle中字符串连接用||
    将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法
    Bootstrap-table 相关参数
  • 原文地址:https://www.cnblogs.com/madpanda/p/4663415.html
Copyright © 2011-2022 走看看