假如我想请2个施工队建2个不同的房子,因为怕麻烦,所以,我仅给了他们一个相同格式的建造清单。
第1个清单写着:
①我需要贵方帮忙建造一个房子,要求如下:
②要求建造的房子的大小:100m²
③要求建造的房子的卫生间数量:2个
④要求建造的房子的卧室数量:2个
第2个清单写着:
①我需要贵方帮忙建造一个房子,要求如下:
②要求建造的房子的房子大小:113m²
③要求建造的房子的卫生间数量:3个
④要求建造的房子的卧室数量:3个
那么我就是指导者Director,这个建设清单就是Builder,两个施工队(team1和team2)就是具体的建造者,最终我得到了产品Product。当我又想请施工队帮我建2个厂房,我给他们一个不同的清单就好了。
问题来了,整个事情应该如何进行?
我发了2个建造清单,2个施工队看到了建造清单的要求,提炼出了我要求的Product关键词(房子大小、卫生间数量和卧室数量),然后制作出效果图发给我,我再通知他们施工。
因此我们需要6个文件:
1. 指导者Director.java,指导者要下建造的命令,因此需要1个GotoBuild方法。
2. 建设清单Builder.java,要求施工队要做的动作。
3. 2个施工队team1.java和team2.java,这2个完成实际的建造工作。
4. 产品Product的House.java。
5. 主Main.java
Main.java代码如下:
代码语言:javascript复制package MyBuilder;
public class Main
{
public static void main(String[] args)
{
House house = new House();
team1 T1 = new team1(house);
Director director1 = new Director(T1);
House product1 = director1.GotoBuild();
System.out.println("面积::" product1.area);
System.out.println("卧室数::" product1.bedroom);
System.out.println("卫生间数::" product1.toilet);
team2 T2 = new team2(house);
Director director2 = new Director(T2);
House product2 = director2.GotoBuild();
System.out.println("面积::" product2.area);
System.out.println("卧室数::" product2.bedroom);
System.out.println("卫生间数::" product2.toilet);
}
}
Main的逻辑是:将Product关键词(House类)给team1,team1将效果图给Director,Director再通知team1施工(GotoBuild方法)
Director.java代码如下:
代码语言:javascript复制package MyBuilder;
public class Director{
private Builder builder;
private House house;
public Director(Builder builder) {
this.builder = builder;
}
public House GotoBuild() {
house = builder.createHouse();
return house;
}
}
Director通过GotoBuild方法下建造的命令。
Builder.java代码如下:
代码语言:javascript复制package MyBuilder;
public interface Builder{
public void createArea();
public void createBedroom();
public void createToilet();
public House createHouse();
}
建设清单Builder指定了几个动作:建造1个房子createHouse,建造卧室,建造卫生间,限定面积。
team1.java代码如下:
代码语言:javascript复制package MyBuilder;
public class team1 implements Builder{
private House house;
public team1(House house) {
this.house = house;
}
public void createArea() {
house.area = 100;
}
public void createBedroom() {
house.bedroom = 2;
}
public void createToilet() {
house.toilet = 3;
}
public House createHouse() {
createArea();
createBedroom();
createToilet();
return house;
}
}
team1根据Builder的要求建造房子。
team2.java代码如下:
代码语言:javascript复制package MyBuilder;
public class team2 implements Builder{
private House house;
public team2(House house) {
this.house = house;
}
public void createArea() {
house.area = 113;
}
public void createBedroom() {
house.bedroom = 3;
}
public void createToilet() {
house.toilet = 4;
}
public House createHouse() {
createArea();
createBedroom();
createToilet();
return house;
}
}