设计模式-建造者模式
一、定义
是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
创建者模式中的四个角色:
- 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()); } }