设计模式之建造者模式

 

背景:需要建造一个房子,建造的房子过程有打地基、砌墙、封顶。建造的类型有普通的房子、高楼。

思路:需要有一个抽象类,里面有建造房子过程的三个方法,然后具体类继承这个抽象类。

关系图如下:

 

 代码实现如下:

AbstractHouse.java

public abstract class AbstractHouse {
    public abstract void buildBasic();
    public abstract void buildWalls();
    public abstract void roofed();
    public AbstractHouse(){
        buildBasic();
        buildWalls();
        roofed();
    }
}

CommonHouse.java

public class CommonHouse extends AbstractHouse{
    @Override
    public void buildBasic() {
        System.out.println("CommonHouse 建造地基");
    }

    @Override
    public void buildWalls() {
        System.out.println("CommonHouse 建造墙");
    }

    @Override
    public void roofed() {
        System.out.println("CommonHouse 建造房顶");
    }
}

Client:

public class Client {
    public static void main(String[] args) {
        CommonHouse commonHouse = new CommonHouse();
    }
}

 

优点:代码十分好理解,简单实现。

缺点:这种做法把产品(即房子)和创建产品的过程(建房子流程)封装在一起,耦合性随之增强。

 

引入建造者模式,把创建的对象和创建的过程分离。

建造者模式的四个角色:

Product: 一个具体的产品对象

Builder:创建一个Product对象的各个部件指定的接口。

ConcreteBuilder:实现接口,构建和装配各个部件。

Director:构建一个使用builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程。二是:负责控制产品对象的生产过程。

 

类图:

 

House.java (产品)

public class House {
    private String basic;
    private String wall;
    private String roof;

    public String getBasic() {
        return basic;
    }

    public void setBasic(String basic) {
        this.basic = basic;
    }

    public String getWall() {
        return wall;
    }

    public void setWall(String wall) {
        this.wall = wall;
    }

    public String getRoof() {
        return roof;
    }

    public void setRoof(String roof) {
        this.roof = roof;
    }
}

 

 HouseBuilder.java (聚合一个House,把建造过程抽象出来)

public abstract class HouseBuilder {
    protected House house = new House();
    public abstract void buildBasic();
    public abstract void buildWall();
    public abstract void buildRoof();
    public  House buildHouse(){
        return house;
    }
}

 

CommonHouse.java (实现houseBuilder中抽象方法)

public class CommonHouse extends HouseBuilder{

    @Override
    public void buildBasic() {
        System.out.println("普通房子打地基");
    }

    @Override
    public void buildWall() {
        System.out.println("普通房子砌墙");
    }

    @Override
    public void buildRoof() {
        System.out.println("普通房子盖屋顶");
    }
}

 

HouseDirector.java (聚合一个具体的builder,进行创建房子)

public class HouseDirector {
    HouseBuilder houseBuilder = null;
    public HouseDirector(HouseBuilder houseBuilder){
        this.houseBuilder = houseBuilder;
    }
    public House constructHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWall();
        houseBuilder.buildRoof();
        return houseBuilder.buildHouse();
    }
}

 

Client.java

public class Client {
    public static void main(String[] args) {
        CommonHouse commonHouse = new CommonHouse();
        HouseDirector houseDirector = new HouseDirector(commonHouse);
        House house = houseDirector.constructHouse();
    }
}

 

output:

普通房子打地基
普通房子砌墙
普通房子盖屋顶

 

建造者模式适用场景:建造者模式所创建的产品一般具有较多的共同点其组成部分相似,如果产品之间的差异很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

posted @ 2020-03-07 17:21  护花使者  Views(104)  Comments(0Edit  收藏  举报