设计模式-建造者模式详解

来源:互联网 发布:淘宝店铺宝贝详情模板 编辑:程序博客网 时间:2024/05/29 17:06

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例: JAVA 中的 StringBuilder。

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

经典的建造者模式一般包含四个角色:

Product:要创建的复杂对象,产品类。

Builder:一个抽象接口或抽象类,以规范产品的建造。这个接口或抽象类规定要实现复杂对象的哪些部分的创建,但是不关注具体实现,一般由子类实现。

ConcreteBuilder:Builder接口的实现类或者Builder抽象类的子类,并返回组建好的复杂对象的实例。

Director:调用具体建造者来创建复杂对象的各个部分,在Director中不涉及具体产品的信息,只负责保证对象各部分完整创建或者按某种顺序创建。

结合案例来看:

产品类:

public class Product {private String mA;private String mB;private String mC;public Product() {}public String getmA() {return mA;}public void setmA(String mA) {this.mA = mA;}public String getmB() {return mB;}public void setmB(String mB) {this.mB = mB;}public String getmC() {return mC;}public void setmC(String mC) {this.mC = mC;}@Overridepublic String toString() {return "partA=" + mA + "\n" + "partB=" + mB + "\n" + "partC=" + mC;}}
这是基本的产品类,假设有三部分组成(A,B,C),toString方法为了后面测试使用。

Builder接口:

public interface Builder {public void buildPartA(String mA);public void buildPartB(String mB);public void buildPartC(String mC);public Product buildProduct();}
里面提供了构建A、B、C的方法和构建产品类的方法。

Builder的实现类:

public class ConcreteBuilder implements Builder {private Product product = new Product();@Overridepublic void buildPartA(String mA) {product.setmA(mA);}@Overridepublic void buildPartB(String mB) {product.setmB(mB);}@Overridepublic void buildPartC(String mC) {product.setmC(mC);}@Overridepublic Product buildProduct() {return product;}}
实现了Builder接口,里面新建了Product产品类,并且还提供了产品类各部分的实现,在最终通过buildProduct()方法返回产品类。
Director类:

public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public Product buildProduc1(String mA, String mB, String mC) {builder.buildPartA(mA);builder.buildPartB(mB);builder.buildPartC(mC);return builder.buildProduct();}public Product buildProduc2(String mA, String mB, String mC) {builder.buildPartB(mB);builder.buildPartA(mA);builder.buildPartC(mC);return builder.buildProduct();}}
Director用来规范产品构建的顺序,不同的构建顺序,可能构建出不同表现的产品,比如如果产品是个玩具,有三个部分组成,可以随即组装,不同的组装顺序就会有不同的表现形式。上面我演示了构建两个产品的方法,根据实际需要,还可能有更多。

protected void testBuild() {Builder builder = new ConcreteBuilder();Director director = new Director(builder);Product product = director.buildProduc1("a", "b", "c");Log.d("ray", "product==" + "\n" + product.toString());}



原创粉丝点击