iOS设计模式之建造者模式

77 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情


设计模式相信大家都很熟悉了,但是越是基础的东西也越是需要经常的回顾与思考,于是着手写一个温故而知新的设计模式回顾系列。
在 8 月,准备把各个常用的不常用的设计模式都进行一次回顾,并大概聊一下各个模式的特点与在 iOS 中的大概使用场景与情况。

这里是设计模式回顾的第八篇,建造者模式的相关回顾。

建造者模式

1、什么是建造者模式

建造者模式也称为生成器模式。它的定义是:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者一般用在复杂对象的生成,就好比盖一间房子,你需要知道房子的经纬度,房子的占地面积,房子的高度,房子的楼层数,房子的样式等等许多的属性。
如果只有一间房子,那么你写个单例就是了,但如果是许许多多间房子呢?那么你就要在每次建房的时候,都要把代码复制过去,那多恐怖!
而用建造者模式就只需把房子的每一个属性的生成都放到方法中。最后在设置一个返回房子的方法表示已经建好了。这样就一可以复用代码,二如果计算方式发生改变的时候,只需要更改建造者的实现方法即可,不需要在每一个生成的地方修改。

2、建造者模式用在什么地方

  • 生成一类复杂的对象,该对象拥有多种属性或者需要通过多个步骤才能生成,涉及到多种不同对象的组合。
  • 建造过程可以通过不同的方式构建对象

一般在比较复杂的 APP 或者游戏中会用到建造者模式,小的、比较简单的不怎么需要使用。

3、建造者模式的使用

建造者分为三个步骤:

  1. 建造者声明需要返回的对象,和所有用来生成、组装对象的方法
  2. 通过调用建造者方法,实现对象模块的生成的组装
  3. 返回该对象

4、总结

建造者使用简单,就是不经常会用到。整体的思想是分离属性,多步构建。
还有要注意的一点是,每个方法最好返回本身。可以实现一句话生成对象。

5、demo

import UIKit

class House: NSObject {
    var place : CGPoint?
    var size : CGSize?
    var height : Float?
    var floorNumber : Int?
    
    override var description: String {
        
        return "place:\(self.place)) size:\(self.size) height:\(self.height) floorNumber:\(self.floorNumber)"
    }
}

import UIKit

class HouseBuilder: NSObject {
    var house = House()
    /// 创建新对象
    func buildNewHouse() -> HouseBuilder {
        self.house = House()
        return self;
    }
    
    /// 位置
    func buildPlace(place:CGPoint) -> HouseBuilder {
        self.house.place = place
        return self;
    }
    
    /// 大小
    func buildSize(size:CGSize) -> HouseBuilder {
        self.house.size = size
        return self;
    }
    
    /// 数量
    func buildFloorNumber(floorNumber:Int) -> HouseBuilder {
        self.house.floorNumber = floorNumber
        return self;
    }
    
    /// 高度
    func buildFloorsHeight(heightArray:[Float]) -> HouseBuilder {
        var currentHeight : Float = 0.0
        heightArray.forEach{currentHeight += ($0)}
        self.house.height = currentHeight
        return self;
    }
    
}
// 调用创建
func buildAHouse(){
        var builder = HouseBuilder()
        builder = builder.buildNewHouse()
            .buildPlace(place: CGPoint(x: 0, y: 0))
            .buildSize(size:CGSize(width: 100, height: 100))
            .buildFloorNumber(floorNumber:2)
            .buildFloorsHeight(heightArray: [2.05,3.0])
        let houseA = builder.house
        
        print(houseA)
    }