建造者模式(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();//最后装上窗 } }
结果: