【设计模式 11】建造者:配置像天书
这一课讲建造者模式。什么在变构造参数越来越复杂组合关系越来越难。怎么挡分步引导每步只问一个问题最后拼出完整对象。赵闯带回来的投诉单林衍看了三遍才看懂。客户是一个上市公司的董事长姓魏。定制了一整套书房家具——书桌、书柜、展示柜、座椅、落地灯。交货那天魏董亲自验货然后一条一条划出问题书桌木材不是他选的黑胡桃是普通胡桃木。五金件没有升级成黄铜。座椅的皮质不是头层牛皮。展示柜的灯带颜色不对。赵闯脸色不好看“这单一千二百万魏董是老客户。”林衍让人调了订单。订单表发过来的时候他明白为什么出错了。一张表格二十三个字段。木材类型、木材等级、五金材质、五金品牌、漆面工艺、漆面色号、皮质类型、皮质颜色、灯带类型、灯带色温、玻璃类型、玻璃厚度、尺寸定制方向、尺寸数值、包装方式、安装方式、售后级别、保修年限、 刻字内容、刻字字体、刻字位置、配送时间、安装时间。二十三个。其中十六个是可选的。可选字段之间有依赖关系选了头层牛皮就不能选布艺坐垫选了黄铜五金就不能选黑色五金选了灯带就必须选电源方案。销售在填这张表的时候选了黑胡桃木字段3、黄铜五金字段5、头层牛皮字段8。但他漏填了一个字段木材等级字段4。系统默认填了普通级。所以最终出的是普通胡桃木而不是黑胡桃。一千二百万的单子毁在一个默认值上。林衍把产品经理李婷和IT总监叫到一起。“这张表谁能填对”李婷诚实地说“我填也会填错。二十三个字段十六个可选还有依赖关系。上次我自己测试新型号都填错了两次。”IT总监说“可以加校验。但校验规则有四十多条加完之后用户填错了会报错但不知道怎么改。”林衍问了一个更根本的问题“为什么让客户一次填二十三个字段”没人回答。“客户买家具的时候是这么想的吗坐在电脑前打开一张表格然后一个字段一个字段地填不是。客户想的是我要一张书桌黑胡桃的黄铜五金头层牛皮座椅。三句话。”林衍在白板上画了一个流程第一步选品类。书桌、书柜、展示柜、座椅、落地灯第二步选木材。黑胡桃、白橡、樱桃木、普通胡桃第三步选五金。黄铜、不锈钢、黑色合金每一步只问一个问题。每个问题只展示跟当前选择相关的选项。选了黑胡桃之后木材等级自动默认最高级因为黑胡桃只有一个等级不需要选。选了黄铜之后漆面自动限定在跟黄铜兼容的范围内。客户走完所有步骤系统自动拼出完整的二十三字段订单。客户不需要看到那二十三个字段。“一步一步来每一步只做一件事最后拼出完整订单。不是让客户一次性面对二十三个空。”李婷说“那加一个新的配置项呢”“加一步就行。不需要改其他步骤。”林衍在白板上画的那个流程——一步一步来每一步只问一个问题——在程序设计里有一个名字建造者模式。把构造过程拆成一步一步的每一步设一个参数最后拼出完整对象。参数之间的组合逻辑是建造者的事调用方不管。usescreatesOrderProcess-builder: OrderBuilderconstruct()«interface»OrderBuilderbuildFrame() : OrderBuilderbuildSurface() : OrderBuilderbuildHardware() : OrderBuilderbuildFinish() : OrderBuildergetResult() : OrderCustomOrderBuilder-order: OrderbuildFrame() : OrderBuilderbuildSurface() : OrderBuilderbuildHardware() : OrderBuilderbuildFinish() : OrderBuildergetResult() : OrderOrder-fields: dict林衍在白板上画的那个流程就是 Director每一步只问一个问题——选品类、选木材、选五金——最后拼出完整的二十三字段订单。孙子说谋无不听则必成大事。一步一步想清楚每一步都不出错大事就成了。建造者模式不是让客户一次面对二十三个空是牵着客户的手一步一步走。本文所有人物、情节、公司名均为虚构如有雷同纯属巧合。