概念:将一个复杂对象的构建与它的表示分离,使同样的构建过程创建不同的表示,这样的设计模式就被称为是建造者模式。其实说简单点就是将一个复杂对象分解为多个简单对象,然后一步一步的构建出来。
优点:
1、封装性好,因为表示与构建分离
2、扩展性好,因为将一个复杂的对象拆分成多个简单对象,多个对象相互独立,有利于系统节藕
3、客户端不必知道产品内部的组成细节,建造者可以对创建过程逐步细化,而不对其他模块产生任何影响,便于控制细节风险
缺点:
1、产品的组成部分必须相同,这就限制了它的使用范围
2、如果产品内部的变化复杂,如果产品内部发生了变化,则建造者也要同步的进行修改,后期维护成本比较大
建造者模式分为四个角色:
产品、抽象建造者、具体建造者、指挥者
- 产品角色:它是包含多个组成部件的复杂角色,由具体的建造者创建
- 抽象建造者:它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含返回一个复杂对象的getResult()方法
- 具体建造者:实现Builder方法,完成复杂部件的各个子部件的具体的创建方法
- 指挥者:它调用构建者对象中的部件构造与装配方法完成复杂对象的构建,在指挥者中不涉及具体产品的信息
UML类图:
话不多说,上代码:
有很多人喜欢从抽象建造者开始写,我个人认为建造者模式其实应该从产品开始划分,因为你只有知道你这个产品是什么,你才能够摆脱之前的固有化思维,当然这也是小弟的个人见解,如有不对的地方还希望大哥们海涵 _
项目背景:客厅装修,一般来说,客厅都包含什么?墙体的装修,沙发的选择,电视机的选择等,建造者模式难得地方就在于如何将一个产品的角色给划分出来,以客厅装修来划分角色那么就是,客厅为产品,它包含了墙体的装修、沙发、电视等组成部分,而装修工人是具体的建造者,他们包含了墙体的装修、沙发以及电视的安装摆放,项目经理为指挥者,他指挥工人们进行装修
//产品:客厅
public class Parlour{
private String wall; //墙
private String tv; //电视
private String sofa; //沙发
//此处省略getter、setter
}
//抽象建造者:工人
public abstract class Decorator{
//创建产品对象
protected Parlour parlour = new Parlour();
//提供抽象方法
public abstract void buildWall();
public abstract void buildTV();
public abstract void buildSofa();
//返回产品对象
public Parlour getResult(){
return pralour;
}
}
//具体的建造者:工人1
public class ConcreteDecorator1 extends Decorator{
public void buildWall(){
system.out.println(“wall1”);
}
public void buildTV(){
system.out.println(“TV1”);
}
public void buildSofa(){
system.out.println(“Sofo1”);
}
}
//具体的建造者:工人2
public class ConcreteDecorator2 extends Decorator{
public void buildWall(){
system.out.println(“wall2”);
}
public void buildTV(){
system.out.println(“TV2”);
}
public void buildSofa(){
system.out.println(“Sofo2”);
}
}
//指挥者:项目经理
public class ProjectManager{
private Decorator builder;
public ProjectManager(Decorator builder){
this.builder = builder;
}
//产品构建与组装方法
public Parlour decorate(){
builder.buildWall();
builder.buildTV();
builder.buildSofo();
builder.getResult();
}
}