博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习-建造者模式
阅读量:6476 次
发布时间:2019-06-23

本文共 3034 字,大约阅读时间需要 10 分钟。

基本概念

建造者模式主要用于分离对象的创建和配置。调用组件负责提供数据。并负责将配置数据传递给建造者。建造者代替调用组件去创建响应的对象。

好处

  • 使修改对象的默认值变简单
  • 调用组件无需关心太多对象的构建过程

何时使用

  • 对象创建需要进行复杂的配置。构造过程复杂。不想默认配置分散到程序的各个角落,此时可以使用建造者模式

示例程序

新建一个名为Builder的 OSX命令行程序

实现如下代码

///Food.swiftclass Burger {        enum Cooked:String {        case rare = "Rare"        case normal = "Normal"        case wellDone = "Well Done"    }        let customerName:String    let veggieProduct:Bool    let patties:Int    let pickles:Bool    let mayo:Bool    let ketchup:Bool    let cook:Cooked            init(name:String,veggie:Bool,patties:Int,pickles:Bool,         mayo:Bool,ketchup:Bool,lettuce:Bool,cook:Cooked) {                self.customerName = name        self.veggieProduct = veggie        self.patties = patties        self.pickles = pickles        self.mayo = mayo        self.ketchup = ketchup        self.cook = cook    }        func printDescription()  {        print("Name \(customerName)")        print("Vegie \(veggieProduct)")        print("Patties \(patties)")        print("Pickles \(pickles)")        print("Mayo \(mayo)")        print("Ketchup \(ketchup)")        print("Cook \(cook.rawValue)")    }}///BurgerBuilder.swiftfinal class BurgerBuilder {    private var veggie:Bool = false    private var pickles:Bool = false    private var mayo:Bool = true    private var ketchup:Bool = true    private var lettuce:Bool = true    private var cooked:Burger.Cooked = .normal    private var patties:Int = 2        func setVeggie(_ choice:Bool) -> BurgerBuilder{        veggie = choice        return self    }        func setPickles(_ choice:Bool) -> BurgerBuilder {        pickles = choice        return self    }        func setMayo(_ choice:Bool) -> BurgerBuilder {        mayo = choice        return self    }        func setKetchup(_ choice:Bool) -> BurgerBuilder {        ketchup = choice        return self    }        func setLettuce(_ choice:Bool) -> BurgerBuilder {        lettuce = choice        return self    }        func setCooked(_ choice:Burger.Cooked) -> BurgerBuilder {        cooked = choice        return self    }        func addPatty(_ choice:Bool) -> BurgerBuilder {        patties = choice ? 3 : 2        return self    }        func buildBurgerObject(name:String) -> Burger {        return Burger(name: name, veggie: veggie, patties: patties, pickles: pickles, mayo: mayo,                      ketchup: ketchup, lettuce: lettuce, cook: cooked)    }}///main.swiftlet builder = BurgerBuilder()let burger:Burger = builder    .setVeggie(true)    .setMayo(false)    .setCooked(.wellDone)    .addPatty(false)    .buildBurgerObject(name: "Joe")burger.printDescription()复制代码

输出结果

Name JoeVegie truePatties 2Pickles falseMayo falseKetchup trueCook Well Done复制代码

上面代码中设置属性的方法返回值可以不写。这里这么写为了实现链式调用。

  • cocoa中建造者模式的应用
cocoa 中 建造者模式的应用var dateBuilder = DateComponents()dateBuilder.hour = 10dateBuilder.day = 6dateBuilder.month = 9dateBuilder.year = 1950dateBuilder.calendar = Calendar(identifier: .gregorian)if let date = dateBuilder.date {    print(date)}复制代码

输出结果:

1950-09-06 02:00:00 +0000复制代码

代码下载地址

转载地址:http://tvqko.baihongyu.com/

你可能感兴趣的文章
Nginx 配置文件 nginx.conf 详解
查看>>
Postgresql窗口函数(二)
查看>>
不小心用js重做了一遍贪吃蛇
查看>>
移除链表倒数第n个元素
查看>>
手动实现.*正则表达式匹配函数
查看>>
springboot - 收藏集 - 掘金
查看>>
JS 中的 This 别再被问倒了,面试常见问题分析
查看>>
Vue上手总结
查看>>
git使用错误记录及解决
查看>>
详解js中的继承(二)
查看>>
CSS 常用的定位和布局方法汇总(已添加源码地址)
查看>>
推荐系统在手机推送中的应用场景设想
查看>>
用来测试的小视频地址集
查看>>
DevOps读书清单:十本应该放入书架的经典
查看>>
关于Vue实例的生命周期created和mounted的区别
查看>>
服务部署如何做到高可用?这份“三级跳”秘籍送给你\n
查看>>
准官宣?余承东证实华为已有自研操作系统
查看>>
浏览器厂商开始默认支持WebAssembly格式
查看>>
百度启动高管退休计划,总裁张亚勤今年十月退休
查看>>
《感知与响应》作者访谈录
查看>>