建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式Demo:
/**
* 2018年3月28日下午10:09:43
*/
package com.Designpattern;
/**
* @author xinwenfeng
*
*/
public class TestBuilder {
/**
* @param args
*/
public static void main(String[] args) {
Director director = new Director();
HouseBuilder hb1 = new BandaBuilder();
director.Construct(hb1);//告诉指挥者造一个茅草屋
House banda = hb1.buildHouse();
banda.showHouse();
System.out.println("=========================");
HouseBuilder hb2 = new VillaBuilder();
director.Construct(hb2);//告诉指挥者造一个别墅
House villa = hb2.buildHouse();
villa.showHouse();
}
}
//产品类,房屋
class House{
private String name;
private String wall;
private String door;
private String window;
private String roof;
public House(String name) {
this.name = name;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getDoor() {
return door;
}
public void setDoor(String door) {
this.door = door;
}
public String getWindow() {
return window;
}
public void setWindow(String window) {
this.window = window;
}
public String getRoof() {
return roof;
}
public void setRoof(String roof) {
this.roof = roof;
}
public void showHouse() {
System.out.println("这是一个带"+window+"的"+wall+"的"+name+",门是"+door+",屋顶是"+roof);
}
}
//抽象建造者类
abstract class HouseBuilder{
public abstract void buildeWall();
public abstract void buildeRoof();
public abstract void buildeDoor();
public abstract void buildeWindow();
public abstract House buildHouse();
}
//具体建造类,茅草屋
class BandaBuilder extends HouseBuilder{
House house = new House("茅草屋");
@Override
public void buildeWall() {
System.out.println("用土堆起了墙");
house.setWall("土坯墙");
}
@Override
public void buildeRoof() {
System.out.println("用茅草盖了屋顶");
house.setRoof("茅草屋顶");
}
@Override
public void buildeDoor() {
System.out.println("装上了木头门");
house.setDoor("木门");
}
@Override
public void buildeWindow() {
System.out.println("装上了纸窗");
house.setWindow("纸窗");
}
@Override
public House buildHouse() {
return house;
}
}
//具体建造类,别墅
class VillaBuilder extends HouseBuilder{
House house = new House("别墅");
@Override
public void buildeWall() {
System.out.println("用大理石砌墙");
house.setWall("大理石墙壁");
}
@Override
public void buildeRoof() {
System.out.println("用琉璃瓦盖屋顶");
house.setRoof("琉璃瓦屋顶");
}
@Override
public void buildeDoor() {
System.out.println("安装上密码门");
house.setDoor("密码门");
}
@Override
public void buildeWindow() {
System.out.println("装上了很大的落地窗");
house.setWindow("大落地窗");
}
@Override
public House buildHouse() {
return house;
}
}
//指挥者类,指挥建造房屋
class Director{
public void Construct(HouseBuilder houseBuilder) {
houseBuilder.buildeWall();//先建造墙壁
houseBuilder.buildeRoof();//再盖屋顶
houseBuilder.buildeDoor();//然后装上门
houseBuilder.buildeWindow();//最后装上窗
}
}
结果: