对Java生成器模式或建造者模式(Builder)的理解

2023-03-21 13:54:14 浏览数 (2)

假如我想请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;
	}
}

0 人点赞