设计模式-建造者模式
本篇文章主要介绍建造者模式。
建造者模式:讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
我们先看下结构图:
Builder是创建Product对象的抽象接口;ConcreteBuilder是具体建造者,实现Builder接口;Producr是具体的产品;Director是指挥者,是构建一个使用Builder接口的对象。
下面我们看下基本代码实现。
package com.lwx.builder; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 20:38 */ public class Product { private String name; private String type; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public String toString() { return "Product{" + "name='" + name + '\'' + ", type='" + type + '\'' + '}'; } }
package com.lwx.builder; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 20:42 */ public interface Builder { void setPart(String name, String type); Product createProduce(); }
package com.lwx.builder; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 20:45 */ public class ConcreteBuilder implements Builder { private Product product = new Product(); public void setPart(String name, String type) { product.setName(name); product.setType(type); } public Product createProduce() { return this.product; } }
package com.lwx.builder; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 20:47 */ public class Director { private Builder builder = new ConcreteBuilder(); public Product buildAProduct() { builder.setPart("法拉利", "911"); return builder.createProduce(); } public Product buildBProduct(){ builder.setPart("宝马汽车", "730"); return builder.createProduce(); } }
代码很简单就不多做解释,下面看下测试类和运行结果。
package com.lwx.builder; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 20:55 */ public class BuildTest { public static void main(String[] args) { Director director = new Director(); Product aProduct = director.buildAProduct(); System.out.println(aProduct.toString()); Product bProduct = director.buildBProduct(); System.out.println(bProduct.toString()); } }
我们可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单工厂模式了。
与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特点的规则组件为产品,然后将组建好的产品交付给客户端。
建造者模式的优点:
建造者模式使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就好了。
最后附上demo的githup地址:https://github.com/yijinqincai/design_patterns