iOS 建造者模式


//【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

//原文地址http://www.cnblogs.com/wengzilin/p/4365855.html


///iOS 建造者模式



//感觉建造者模式与工厂方法模式非常类似,但是加入了指挥者类。



//工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品

// 工厂模式把一个类的实例化延迟到它的子类中,核心的工厂类不负责所有产品的创建,而是将具体创建的工作交给子类去做。让子类决定实例化哪一个类。即抽象工厂角色

//建造者模式也是创建一个产品,但是不仅要把这个产品创建出来,还要关系这个产品的组成细节,组成过程。从代码上看,建造者模式在建造产品时,这个产品有很多方法,建造者模式会根据这些相同方法但是不同执行顺序建造出不同组成细节的产品。

//建造者模式将一个产品的内部表象和产品的生成过程分开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

//需要构造的对象非常复杂,而调用者不需要知道这些细节

//建造模式的关键是导演角色,这个角色掌握了零件对象的状态和产品的整体组装蓝图。没有了这个角色,建造模式就不是建造模式。当然,导演角色可以同时持有几种蓝图,按照需要给出完全不同的组装结果。




//房子产品

class ZJLRoom:NSObject {

    

    var price:String!

    var roomColor:String!

    var size:String!

    var style:String!

    

    ///创建房子的方法

    classfunc creatBuilder(callback:((ZJLRoomBuilder)->Void)?) ->ZJLRoom {

        let builder =ZJLRoomBuilder()

        callback?(builder)

        return builder.build()

    }

    

    overrideinit() {

      

    }

    

    func lookRoom() {

        print(price)

        print(roomColor)

        print(size)

        print(style)

    }

}


//房子建造者  导演角色负责房子产品的组成以及各个

class ZJLRoomBuilder:NSObject {

    var price:String =""

    var roomColor:String =""

    var size:String =""

    var style:String =""

    

    func build() ->ZJLRoom {

        let room =ZJLRoom()

        room.price =price

        room.roomColor =roomColor

        room.size =size

        room.style =style

        return room

    }

}



//现在这个车有两种初始化方法 一种是:


/*

 

var room = ZJLRoom()

room.price = "100000"

room.roomColor = "白色"

room.size = "100m²"

room.style = "装修"

 

一种是:是在init方法里面实现


*/


//实际上,以上两种方式分别代表了两种iOS对象的初始化方式。在未使用建造者之前,这两种初始化对象方式都有不方便的地方。第一种方法灵活,但是如果你接触iOS时间长点就会发现,经常会记不住这个类到底有哪些属性需要初始化,尤其是当这个类是被人提供给你的时候!我们多么希望类的提供者能搞点注释啊啥的告知我们一下。第二种方法则很清晰地告诉调用者到底有哪些属性需要在创建对象时初始化。但是,当类的提供者有天跟你说:hey,哥们,现在业务逻辑改变了,我增加了一个xxx属性,init方法也变了。这时,你是不是很想打他?每新增一个新的属性,init方法就要变动,而且当需要初始化的属性多大十几二十个时,这个init方法要不要太壮观!

//所以,当某个类的属性值很多时,我们可以考虑使用建造者模式建造者来让初始化过程清晰一些,类的使用者会很感恩你这么做的。用iOS描述大概是这样的:


var room2 = ZJLRoom.creatBuilder { (builder)in

    builder.price ="883333"

    builder.roomColor ="紫色"

    builder.size ="2000m²"

    builder.style ="欧式9"

}


room2.lookRoom()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值