设计模式-建造者模式

一、定义

 是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

创建者模式中的四个角色:

  • Product产品类:由一系列部件组成,要创建的复杂对象。
  • Builder抽象建造者:给出一个抽象接口,规范产品的组建。
  • ConcreteBuilder具体创建者:实现Builder接口,组建产品并且返回组建好的产品。
  • Director导演类:调用具体建造者来创建复杂对象的各个部分,在导演类中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

二、类型

 创建型

三、适用场景

  • 产品具有复杂的内部结构。
  • 产品对象通常包含多个成员属性,需要生成的产品对象的属性相互依赖,需要指定其生成顺序。

四、优点

  • 客户端不必知道产品内部的组成细节。
  • 可以更加精细地控制产品的创建过程
  • 建造者独立容易扩展,增加新的具体建造者无须修改原有类库的代码。

五、缺点

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

六、类图

 

七、代码实现

 产品类(可定义为抽象产品类):

package com.wms.createtype.builder;

public class GameRole {
    private String skinColor;
    private String height;
    private String weight;

    public String getSkinColor() {
        return skinColor;
    }

    public void setSkinColor(String skinColor) {
        this.skinColor = skinColor;
    }

    public String getHeight() {
        return height;
    }

    public void setHeight(String height) {
        this.height = height;
    }

    public String getWeight() {
        return weight;
    }

    public void setWeight(String weight) {
        this.weight = weight;
    }
}

 建造者抽象类:

package com.wms.createtype.builder;

public abstract class Builder {
    public abstract void bulidSkinColor();
    public abstract void bulidHeight();
    public abstract void bulidWeight();
    public abstract GameRole buildGameRole();
}

 建造者实现类:

package com.wms.createtype.builder;

public class ChinaBuilder extends Builder {

    private GameRole gameRole;

    public ChinaBuilder() {
        gameRole = new GameRole();
    }

    public void bulidSkinColor() {
        gameRole.setSkinColor("黄色皮肤");
    }

    public void bulidHeight() {
        gameRole.setHeight("身高175cm");
    }

    public void bulidWeight() {
        gameRole.setWeight("体重75kg");
    }

    public GameRole buildGameRole() {
        return gameRole;
    }
}
package com.wms.createtype.builder;

public class EnglandBuilder extends Builder {

    private GameRole gameRole;

    public EnglandBuilder() {
        gameRole = new GameRole();
    }

    public void bulidSkinColor() {
        gameRole.setSkinColor("白色皮肤");
    }

    public void bulidHeight() {
        gameRole.setHeight("身高185cm");
    }

    public void bulidWeight() {
        gameRole.setWeight("体重85kg");
    }

    public GameRole buildGameRole() {
        return gameRole;
    }
}

导演类:

package com.wms.createtype.builder;

public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public GameRole getGameRole() {
        builder.bulidSkinColor();
        builder.bulidHeight();
        builder.bulidWeight();
        return builder.buildGameRole();
    }
}

客户端:

package com.wms.createtype.builder;

public class TestDesignPattern {
    public static void main(String[] args) {
        Builder chinaBuilder = new ChinaBuilder();
        Director chinaDirector = new Director(chinaBuilder);
        GameRole chinaGameRole = chinaDirector.getGameRole();
        System.out.println("skinColor:" + chinaGameRole.getSkinColor() + ", height=:" + chinaGameRole.getHeight()
                + ", weight='" + chinaGameRole.getWeight());

        Builder englandBuilder = new EnglandBuilder();
        Director englandBuider = new Director(englandBuilder);
        GameRole englandGameRole = englandBuider.getGameRole();
        System.out.println("skinColor:" + englandGameRole.getSkinColor() + ", height=:" + englandGameRole.getHeight()
                + ", weight='" + englandGameRole.getWeight());
    }
}

 

posted @ 2018-12-29 20:53  请叫我大表哥  阅读(223)  评论(0编辑  收藏  举报