建造者模式:像是模板方法模式的升级。也叫生成器模式。将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。其实就是创建一大类的东西, 但是具体又有些差异。
在建造者模式中,一般有四个角色:
1,Product产品类。
该类一般实现了模板方法模式。
2,Builder抽象的建造者。
规范产品的组建,一般是由子类实现。
3,ConcreteBuilder具体的建造者。
实现抽象类定义的所有方法,并且可以返回一个组建好的具体对象。
4,Director导演类(一般是包涵多种具体产品差异的方法)。
大致示例代码:
Product类:
1 package com.yemaozi.builderpattern; 2 3 public abstract class Product { 4 //一般实现模板方法的抽象类。 5 }
具体的Product类:
//ProductA package com.yemaozi.builderpattern; public class ProductA extends Product{ public void doSomething(){ } } //ProductB package com.yemaozi.builderpattern; public class ProductB extends Product{ public void doSomethding(){ } }
建造器:
1 package com.yemaozi.builderpattern; 2 3 public interface Builder { 4 //设置产品不同的方法 5 public abstract void setPart(); 6 //构建产品 7 public abstract Product builderProduct(); 8 }
具体的建造器,具体的建造器个数与具体产品类的数目一致。
1 //ConcreteBuilderA 2 package com.yemaozi.builderpattern; 3 4 public class ConcreteBuilderA implements Builder{ 5 6 Product p = new ProductA(); 7 8 public void setPart() { 9 } 10 11 public Product builderProduct() { 12 return p; 13 } 14 } 15 //ConcreteBuilderB 16 package com.yemaozi.builderpattern; 17 18 public class ConcreteBuilderB implements Builder{ 19 20 Product p = new ProductB(); 21 22 public void setPart() { 23 } 24 25 public Product builderProduct() { 26 return p; 27 } 28 }
导演类:导演类一般是为了预设置不同产品差异的,若是想得到对应的产品,直接到Director里获取,因为,该类就是为了生产出所有的产品,以供获取。导演类一般可以有多个。
1 package com.yemaozi.builderpattern; 2 3 public class Director { 4 private Builder b1 = new ConcreteBuilderA(); 5 private Builder b2 = new ConcreteBuilderB(); 6 //构建A产品 7 public Product getProductA(){ 8 b1.setPart(); 9 Product p = b1.builderProduct(); 10 return p; 11 } 12 //构建B产品 13 public Product getProductB(){ 14 b2.setPart(); 15 return b2.builderProduct(); 16 } 17 }
此外,建造者模式还有一个重要的角色,就是零件(理解为产品类里的方法),建造者是通过零件的组装来创建对象。组装顺序不同(调用方法顺序不同),建造的对象就会有着差异,也是,建造者模式要表达的核心意义。说白了,建造者最主要的功能是基本方法的调用顺序的安排。
和工厂模式的差异:
工厂方法模式重点是创建。创建零件是它的主要职责,组装顺序不是它关心的。
建造者模式重点是对已产生的零件进行组装。从而也达到创建对象的效果。