创建者模式-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
不积跬步,无以至千里。不积小流,无以成江海!