1. 建造者模式定义:将一个复杂对象的构建与她的表示分离,使得同样的建造过程可以创建不同的表示。Separate the construction of a complex object from its representation so that the same construction process can create different representations.
2. 简单代码示例:
public abstract class House { //先使用模板方法定义一个房子的抽象类,房子各个部分的具体设计可以由子类进行设计
public abstract void setKeTing();
public abstract void setWoShi();
public abstract void setCeSuo();
public abstract void setShuFang();
public abstract void setCanTing();
public void setHouse(int [] requirement) //此方法用于组成一个房子, 房子可以由上述设计的某几个部分组成,而具体的组成可有建造者根据需求来设计。
{
for(int i=0;i<requirement.length;i++)
{
switch(requirement[i])
{
case 1: setKeTing();break;
case 2: setWoShi();break;
case 3: setCeSuo();break;
case 4: setShuFang();break;
case 5: setCanTing();break;
case 6: setWoShi();System.out.print("在卧室里面还带有");setCeSuo();break;
}
}
}
}
public class HouseDesign extends House { //房子的各个部分进行的具体设计,通过模板方法可以将调用和设计解耦
@Override
public void setKeTing() {
// TODO Auto-generated method stub
System.out.println("这个样子设计的客厅");
}
@Override
public void setWoShi() {
// TODO Auto-generated method stub
System.out.println("这个样子设计的卧室");
}
@Override
public void setCeSuo() {
// TODO Auto-generated method stub
System.out.println("这个样子设计的厕所");
}
@Override
public void setShuFang() {
// TODO Auto-generated method stub
System.out.println("这个样子设计的书房");
}
@Override
public void setCanTing() {
// TODO Auto-generated method stub
System.out.println("这个样子设计的餐厅");
}
}
public abstract class HouseBuilder { //抽象的建造者
public abstract void setCondition();
public abstract House getHouse();
}
public class HousePattern1Builder extends HouseBuilder{ //一个具体的建造者,建造按照某种模式,或者客户指定的模式建造
House house=new HouseDesign();
static int []requirement={1,2,3,4,5};
public HousePattern1Builder() {
// TODO Auto-generated constructor stub
this(requirement);
}
public HousePattern1Builder(int [] require) {
// TODO Auto-generated constructor stub
requirement=require;
setCondition();
}
@Override
public void setCondition() {
// TODO Auto-generated method stub
house.setHouse(requirement);
}
@Override
public House getHouse() {
// TODO Auto-generated method stub
return house;
}
}
public class HousePattern2Builder extends HouseBuilder { //如果组成十分复杂,种类繁多,可以定义多种建造者,建造不同种类的房子或者产品。
House house=new HouseDesign();
static int []requirement={1,6,3,4,5};
public HousePattern2Builder() {
// TODO Auto-generated constructor stub
this(requirement);
}
public HousePattern2Builder(int [] require) {
// TODO Auto-generated constructor stub
requirement=require;
setCondition();
}
@Override
public void setCondition() {
// TODO Auto-generated method stub
house.setHouse(requirement);
}
@Override
public House getHouse() {
// TODO Auto-generated method stub
return house;
}
}
System.out.println("建造者模式"); System.out.println("------------------------生产第一种模式的房子--------------------------"); HouseBuilder houseBuilder1=new HousePattern1Builder(); //调用者不用知道具体是怎么建造的,它只负责提供某些需求 House house=houseBuilder1.getHouse(); //然后由具体建造者负责建造出来。 System.out.println("------------------------生产第二种模式的房子--------------------------");
HouseBuilder houseBuilder2=new HousePattern2Builder(CustomerRequire); House house2=houseBuilder2.getHouse();int [] CustomerRequire={1,6,3,4,5};
建造者模式
------------------------生产第一种模式的房子--------------------------
这个样子设计的客厅
这个样子设计的卧室
这个样子设计的厕所
这个样子设计的书房
这个样子设计的餐厅
------------------------生产第二种模式的房子--------------------------
这个样子设计的客厅
这个样子设计的卧室
在卧室里面还带有这个样子设计的厕所
这个样子设计的厕所
这个样子设计的书房
这个样子设计的餐厅
使用建造者模式可以使客户不用知道产品内部的组成细节,不同模式的组成相互独立,建造的过程可以逐步细化而不对其他模块产生影响。建造者模式适用于零件的装配(不同的顺序,不同的零件,甚至不同的装备方法以达到不同的效用)。建造者模式对于复杂对象的封装创建很有用。