简介
Builder模式是一步一步创建一个复杂的创建创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。
该模式是为了将构建复杂对象的过程和它的部件解耦,使得过程和部件的表示隔离开来。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用场景
(1)相同的方法,不同的执行顺序,产生不同的事件结果时。
(2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常适合。
(4)当初始化一个对象特别复杂时,如参数多,且很多参数都具有默认值时。
结构
抽象建造者(Builder):主要用于规范产品类的各个组成部分,并提供一个返回完整产品的接口。
具体建造者(Concrete Builder):实现 抽象建造者 规定的各个方法,返回一个组件好的具体产品。
产品(Product):构建相当复杂的类型,建造者最终创建的产品类型。 导
演者(Director):指导 建造者(Builder) 以特定行为构建出产品,并将其返回给客户。
总结:理解了建造者模式的四种角色,其实就已经掌握了建造者模式的真谛:建造者模式最终返回一个具体的构建复杂的产品;系统中产品可能只有一种类型或多种类型,但对某些产品族来说,它们具备相同的行为,因此对这些共性行为进行抽象,抽离出抽象建造者(Builder);而对这些行为的具体构建过程,则交由具体建造者(Concrete Builder)负责,不同的具体建造者会构建出不同表示的产品;而具体要构建出哪种产品,由导演者(Director)决定。导演者会选择不同的具体建造者,指导它构建出产品。
代码1
https://www.jianshu.com/p/9a90ca0fc24f
代码2
https://www.jianshu.com/p/9a90ca0fc24f
https://www.jianshu.com/p/55a74764d6b4
事实上,在平常的代码中,我们通常都会忽略对象的复杂性,使用工厂模式创建对象,而不是建造者模式。正如上文所讲,工厂模式和建造者模式的作用都是用于创建一个产品对象,而工厂模式结构更加简洁直接(没有 Builder 和 Director),因此更常使用。
而建造者模式,我们更加习惯使用静态内部类的方式进行实现,即一个产品类内部自动带有一个具体建造者(Concrete Builder),由它负责该产品的组装创建。不再需要抽象建造者(Builder)和导演者(Director),这样,使得产品与构建之间的联系更加紧密,结构更加紧凑,同时使得建造者模式形式更加简洁。
当我们采用静态内部类形式实现建造者模式时,上文中的例子就可以改写为如下:
与工厂模式有何区别
工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。
顾客走进一家餐馆点餐,我们利用工厂模式,根据用户不同的选择,来制作不同的食物,比如披萨、汉堡、沙拉。对于披萨来说,用户又有各种配料可以定制,比如奶酪、西红柿、起司,我们通过建造者模式根据用户选择的不同配料来制作披萨。
实际上,我们也不要太学院派,非得把工厂模式、建造者模式分得那么清楚,我们需要知道的是,每个模式为什么这么设计,能解决什么问题。只有了解了这些最本质的东西,我们才能不生搬硬套,才能灵活应用,甚至可以混用各种模式创造出新的模式,来解决特定场景的问题。
实际项目
圈外的参数校验