一、认识建造者模式
上面的例子如果你有点懵,没关系下面好好地理一理。使用一张图来表示一下建造者模式
上面的流程梳理一下,一共有5个角色
(1)用户:也就是我们消费者,用户提要求,要建一个什么样的房子
(2)Director(开发商):他自己不会开发,就像万达老板一样可能不会砌墙这些,但是他找包工头去做,他只需要去调用这些包工头就造房子就好了。
(3)Builder(抽象的包工头):给出一个抽象接口,规定房子由哪几部分组成,如何去建造。给下面的包工头一个建房子的规范。
(4)ContreteBuilder(具体包工头):真正建房子的人,但是每一个包工头可以建不同的房子。
(5)Product(房子):也就是我们的产品类。
再给出一张类图看一下他们几个在类上的关系
明白了吧。如果还不清楚,在往下看,代码去演示一下。
二、代码实现建造者模式
我们代码实现的时候,是从后往前走的,比如说是先有房子然后建造者这些。
第一步:定义Product(房子)
//角色:产品类房子 public class House { private String bedroom;//卧室 private String kitchen;//厨房 private String toilet;//厕所 //getter和setter方法 //toString方法 }
第二步:抽象建造者接口
//角色:包工头 public interface IBuilder { public void buildBedroom();//建卧室 public void buildKitchen();//建厨房 public void buildToilet();//建厕所 House retrieveResult(); }
第三步:具体建造者(这里有两个包工头A和B)
包工头B和A是一样的代码。只是名字不同,这里就给出一个
//角色:具体建造者(包工头A) public class HouseBuilderA implements IBuilder { //先有一个空壳子,卧室厨房厕所都没有 private House house = new House(); //开始建造卧室 @Override public void buildBedroom() { house.setBedroom("包工头A:卧室建造成功"); } //开始建造卧室 @Override public void buildKitchen() { house.setKitchen("包工头A:厨房建造成功"); } //开始建造卧室 @Override public void buildToilet() { house.setToilet("包工头A:厕所建造成功"); } //房子建好了,直接返回 @Override public House retrieveResult() { return house; } }
第四步:Director(开发商指挥者)
//角色:director(开发商) public class Developer { //有一个包工头:具体是哪一个我不知道 private IBuilder builder; //让包工头受开发商管理 public Developer(IBuilder builder) { this.builder = builder; } //开发商一声令下,包工头开始造房子 public void construct(){ builder.buildBedroom(); builder.buildKitchen(); builder.buildToilet(); } }
第五步:用户
//角色:用户 public class User { public static void main(String[] args) { //创建包工头 IBuilder builderA = new HouseBuilderA(); IBuilder builderB = new HouseBuilderB(); //创造开发商角色,给定建造者对象:A或者B Developer director = new Developer(builderA); director.construct(); //制造完成:出来一个房子 House productA = builderA.retrieveResult(); System.out.println(productA.toString()); } }
三、总结
(1)优点
- 将产品本身与产品创建过程进行解耦,
- 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
- 增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
(2)缺点
- 如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
OK,建造者模式就先讲到这里,如有问题还请批评指正。