定义:Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。)html
意图:将一个复杂的构建与其表示相分离,使得一样的构建过程能够建立不一样的表示。算法
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的建立工做,其一般由各个部分的子对象用必定的算法构成;因为需求的变化,这个复杂对象的各个部分常常面临着剧烈的变化,可是将它们组合在一块儿的算法却相对稳定。app
● Product产品类ide
一般是实现了模板方法模式,也就是有模板方法和基本方法,例子中的BenzModel和BMWModel就属于产品类。测试
● Builder抽象建造者ui
规范产品的组建,通常是由子类实现。例子中的CarBuilder就属于抽象建造者。spa
● ConcreteBuilder具体建造者code
实现抽象类定义的全部方法,而且返回一个组建好的对象。例子中的BenzBuilder和BMWBuilder就属于具体建造者。htm
● Director导演类对象
负责安排已有模块的顺序,而后告诉Builder开始建造
建造者(Builder)模式的主要角色以下。
什么时候使用:一些基本部件不会变,而其组合常常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:建立和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例: 一、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是常常变化的,生成出所谓的"套餐"。 二、JAVA 中的 StringBuilder。
优势: 一、建造者独立,易扩展。 二、便于控制细节风险。
缺点: 一、产品必须有共同点,范围有限制。 二、如内部变化复杂,会有不少的建造类。
使用场景: 一、须要生成的对象具备复杂的内部结构。 二、须要生成的对象内部属性自己相互依赖。
● 相同的方法,不一样的执行顺序,产生不一样的事件结果时,能够采用建造者模式。
● 多个部件或零件,均可以装配到一个对象中,可是产生的运行结果又不相同时,则可使用该模式。
● 产品类很是复杂,或者产品类中的调用顺序不一样产生了不一样的效能,这个时候使用建造者模式很是合适。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
步骤 1(产品角色)
步骤 2(抽象建造者(Builder))
步骤 3 ConcerteBuilder类——具体建造者类 ConcerteBuilder2类——具体建造者类(具体建造者(Concrete Builder))
步骤 4(指挥者(Director))
步骤 5
咱们假设一个快餐店的商业案例,其中,一个典型的套餐能够是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)能够是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)能够是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。
咱们将建立一个表示食物条目(好比汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。
建造者模式与工厂模式的不一样:
建造者模式最主要的功能是基本方法的调用顺序安排,这些基本方法已经实现了,顺序不一样产生的对象也不一样;
工厂方法则重点是建立,建立零件是它的主要职责,组装顺序则不是它关心的。