建造者模式
对象的创建:builder模式是为对象的创建而设计的模式
创建的是一个复合对象,被创建的对象为一个具有复合属性的复合对象。关注对象创建的各个部分创建过程,不同工厂(这里指的是builder生成器)。对产品属性有不同的创建方法。
- 设计师:Director 里面含有建造者Builder的引用,调用builder的方法执行事件
- Builder接口 :构建者接口,工程师,创建对象的操作都是由这个工程师完成,设计师相当于在一个方法中调用工程师的多个方法建对象
- ConcreteBuilder类: 实际的工程师:比如平房的工程师和公寓工程师等,是builder的实现类
- product:需要创建的对象。
实例:
创建一个房子house,通过设计师houseDirector调用工程师houseBuilder的方法完成并返回一个房子:代码如下
public class House {
//地板
private String floor;
//墙
private String wall;
//屋顶
private String housetop;
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getHousetop() {
return housetop;
}
public void setHousetop(String housetop) {
this.housetop = housetop;
}
@Override
public String toString() {
return "House{" +
"floor='" + floor + '\'' +
", wall='" + wall + '\'' +
", housetop='" + housetop + '\'' +
'}';
}
}
**************************************************************
/**
* 工程队建房子
*/
public interface HouseBuilder {
//铺地板
public void makeFloor();
//涂墙壁
public void makeWall();
//建屋顶
public void makeHousetop();
public House getHouse();
}
**************************************************************
公寓工程师
public class GongyuBuilder implements HouseBuilder{
House house = new House();
@Override
public void makeFloor() {
house.setFloor("公寓-->地板");
}
@Override
public void makeWall() {
house.setWall("公寓-->墙壁");
}
@Override
public void makeHousetop() {
house.setHousetop("公寓-->屋顶");
}
@Override
public House getHouse() {
return house;
}
}
**************************************************************
/**
* 平房工程队
*/
public class PingfangBuilder implements HouseBuilder {
House house = new House();
@Override
public void makeFloor() {
house.setFloor("平房--》地板");
}
@Override
public void makeWall() {
house.setWall("平房--》墙壁");
}
@Override
public void makeHousetop() {
house.setHousetop("平房--》屋顶");
}
@Override
public House getHouse() {
return house;
}
}
**************************************************************
房子设计师:完成建房子操作
public class HouseDirector {
HouseBuilder houseBuilder;
public HouseDirector(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public void makeHouse() {
houseBuilder.makeWall();;
houseBuilder.makeHousetop();
houseBuilder.makeFloor();
}
}
**************************************************************
测试:
public class MainClass {
public static void main(String[] args) {
//客户自己建
// House house = new House();
// house.setFloor("地板");
// house.setHousetop("屋顶");
// house.setWall("墙");
//工程队建房子
HouseBuilder builder = new PingfangBuilder();
builder.makeFloor();
builder.makeHousetop();
builder.makeWall();
House house = builder.getHouse();
System.out.println(house);
System.out.println("**************************");
//设计师来建
// HouseBuilder ber = new PingfangBuilder();
GongyuBuilder ber = new GongyuBuilder();
HouseDirector houseDecrector = new HouseDirector(ber);
houseDecrector.makeHouse();
House house1 = ber.getHouse();
System.out.println(house1);
}
}
**************************************************************
输出结果:
House{floor='平房--》地板', wall='平房--》墙壁', housetop='平房--》屋顶'}
**************************
House{floor='公寓-->地板', wall='公寓-->墙壁', housetop='公寓-->屋顶'}