创建者模式-Builder

创建者模式使用多个简单的对象一步一步构建成一个复杂的对象。它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象,该 Builder 类是独立于其他对象的。

一、类图

 

创建者模式包括以下几种角色:

  • Builder:为创建一个Product对象的各个部件指定抽象接口。
  • ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个获取产品的接口。
  • Director:构造一个使用Builder接口的对象。
  • Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程 。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

将上面的类图用代码表示如下

public class BuilderClient {

    public static void main(String[] args) {
        // 具体创建者
        Builder builder = new ConcreteBuilder();
        // 指导者
        Director director = new Director(builder);
        // 指导者创建产品
        Product product = director.construct();
    }
}

/**
 * 产品角色
 */
class Product {

}

/**
 * 抽象建造者
 */
interface Builder {
    /**
     * 产品零件1部分的建造方法
     */
    void buildPart1();

    /**
     * 产品零件2部分的建造方法
     */
    void buildPart2();

    /**
     * 返回完整产品
     */
    Product getProduct();

}

/**
 * 具体的创建者
 */
class ConcreteBuilder implements Builder {

    private Product product = new Product();

    @Override
    public void buildPart1() {
        System.out.println("创建了part1");
    }

    @Override
    public void buildPart2() {
        System.out.println("创建了part2");
    }

    @Override
    public Product getProduct() {
        return product;
    }

}

/**
 * 指导角色
 */
class Director {

    private Builder builder;

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

    Product construct() {
        // 负责构建各个零件
        builder.buildPart1();
        builder.buildPart2();
        // 获取产品
        return builder.getProduct();
    }

}
 

二、示例

在当前前后端分离已经成为主流开发模式的情况下,Rest API是经常使用到的。在向前段提供Rest接口时,可以对返回结果进行封装,这里就可以用到创建者模式
 
返回对象
/**
 * REST API返回类
 */
public class RestAPIResponse<T> {

    // 返回码
    private String code;
    // 返回状态,成功或失败
    private String message;
    // 数据
    private T data;

    // getter/setter

}

创建返回对象的创建者

public class RestAPIResponseBuilder {

    /**
     * 成功返回,带数据
     */
    public static <T> RestAPIResponse buildSuccessResponse(T data) {
        RestAPIResponse response = new RestAPIResponse();
        response.setCode("200");
        response.setMessage("success");
        response.setData(data);
        return response;
    }

    /**
     * 失败返回,不带数据
     */
    public static RestAPIResponse buildFailureResponse(String message) {
        RestAPIResponse response = new RestAPIResponse();
        response.setCode("404");
        response.setMessage(message);
        response.setData(null);
        return response;
    }

}

客户端

public class Client {

    public static void main(String[] args) {
        /*********************没有加返回接收******************/
        //返回成功
        RestAPIResponse response = RestAPIResponseBuilder.buildSuccessResponse("数据");
        System.out.println(response.getCode() + "|" + response.getMessage() + "|" + response.getData());

        //返回失败
        RestAPIResponse response2 = RestAPIResponseBuilder.buildFailureResponse("错误信息");
        System.out.println(response2.getCode() + "|" + response2.getMessage() + "|" + response2.getData());
    }

}

在上面这个例子中,创建者和指导者合二为一。

 

 ……更多设计模式的内容,可以访问Refactoring.Guru
posted @ 2017-06-12 17:52  静水楼台/Java部落阁  阅读(240)  评论(0编辑  收藏  举报