建造者模式

建造者模式

  1. 概述
  1. 建造者模式(Builder pattern),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的标识
  2. 建造者模式是一步一步的创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
  3. 建造者模式属于对象创建型模式,又称为生成器模式
  1. 建造者模式的角色
  1. Builder:抽象建造者,用于构建角色的抽象方法
  2. ConcreateBuilder:具体构建者,在创建具体角色对象时,使用该角色进行创建
  3. Director:指挥者,用于根据不同的参数创建不同的产品角色对象
  4. Product:产品角色,具体的创建的对象
  1. demo
    产品角色
/**
 * @author : [email protected]
 * @description : 产品角色
 * @date : 2018/7/26 上午9:46
 */
public class Role {

    private String head;
    private String face;
    private String body;
    private Double hp;
    private Double sp;
    private Double mp;

    //省略getter、setter、toString
}

抽象建造者

/**
 * @author : [email protected]
 * @description : 抽象建造者
 * @date : 2018/7/26 上午10:12
 */
public abstract class Builder {

    protected Role role = new Role();

    public abstract void buildHead();

    public abstract void buildFace();

    public abstract void buildBody();

    public abstract void buildHp();

    public abstract void buildSp();

    public abstract void buildMp();

    public Role getResult() {
        return role;
    }
}

具体建造者

/**
 * @author : [email protected]
 * @description : 具体建造者
 * @date : 2018/7/26 上午10:25
 */
public class CommonRoleBuilder extends Builder{

    private Role role = new Role();

    @Override
    public void buildHead() {
        role.setHead("common head");
    }

    @Override
    public void buildFace() {
        role.setFace("common face");
    }

    @Override
    public void buildBody() {
        role.setBody("common body");
    }

    @Override
    public void buildHp() {
        role.setHp(100d);
    }

    @Override
    public void buildSp() {
        role.setSp(100d);
    }

    @Override
    public void buildMp() {
        role.setMp(100d);
    }

    @Override
    public Role getResult() {
        return role;
    }
}


/**
 * @author : [email protected]
 * @description : 具体建造者
 * @date : 2018/7/26 上午10:29
 */
public class SpuerRoleBuilder extends Builder {

    private Role role = new Role();

    @Override
    public void buildHead() {
        role.setHead("super head");
    }

    @Override
    public void buildFace() {
        role.setFace("super face");
    }

    @Override
    public void buildBody() {
        role.setBody("super body");
    }

    @Override
    public void buildHp() {
        role.setHp(1000d);
    }

    @Override
    public void buildSp() {
        role.setSp(1000d);
    }

    @Override
    public void buildMp() {
        role.setMp(1000d);
    }

    @Override
    public Role getResult() {
        return role;
    }
}

指挥者

/**
 * @author : [email protected]
 * @description : 指挥者
 * @date : 2018/7/26 上午10:34
 */
public class Director {

    public void construct (Builder builder){
        builder.buildBody();
        builder.buildHead();
        builder.buildFace();
        builder.buildHp();
        builder.buildMp();
        builder.buildSp();
    }
}

测试

/**
 * @author : [email protected]
 * @description : 测试类
 * @date : 2018/7/26 上午10:36
 */
public class BuilderMain {


    public static void main(String[] args) {
        Director director = new Director();
        Builder commonBuilder = new CommonRoleBuilder();
        director.construct(commonBuilder);
        Role commonRole = commonBuilder.getResult();
        System.out.println(commonRole);

    }
}

测试结果

head=common head,face=common face,body=common body,hp=100.0,sp=100.0,mp=100.0
  1. 分析
  1. 在建造者模式中,引入了指挥者角色Director,主要的作用为
  1. 隔离了客户端与生产过程
  2. 负责控制产品的生产过程
  1. 指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完成的产品对象
  1. 建造者模式优点
  1. 客户端不需要知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
  2. 每个具体的建造者都相对独立,而与其他的具体建造者无关,因此可以很方便的替换具体的建造者或者增加新的具体建造者,用户使用不同的建造者即可得到不同的产品对象
  3. 可以更加精细的控制产品的创建过程。
  4. 增加新的具体建造者无需修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合开闭原则
  1. 建造者模式缺点
  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很强,则不适合使用建造者模式,因此使用范围受到一定的限制
  2. 如果产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大
  1. 适用环境
  1. 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
  2. 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
  3. 对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
  4. 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
  1. 参考
    http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html
    http://www.hollischuang.com/archives/1477

写在最后
做一个灵魂和肉体分离的人,灵魂不受肉体的束缚,灵魂可以指挥肉体

你可能感兴趣的:(建造者模式)