设计模式-建造者模式详解
来源:互联网 发布:淘宝店铺宝贝详情模板 编辑:程序博客网 时间: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());}
- 设计模式详解之建造者模式
- 【设计模式】建造者模式详解
- 设计模式-建造者模式详解
- 设计模式-------建造者
- 设计模式-建造者
- 建造者设计模式
- 建造者设计模式
- 建造者设计模式
- 设计模式-建造者
- 建造者设计模式
- 建造者设计模式
- 建造者设计模式
- [设计]建造者模式
- 设计模式:建造者模式
- 设计模式---建造者模式
- 设计模式---建造者模式
- 设计模式-----建造者模式
- 设计模式-【建造者模式】
- 深入了解移动端车牌识别与PC端车牌识别的区别
- DuplicateHandle 函数的使用----翻译
- jsp自定义标签
- Java核心能力
- iOS开发
- 设计模式-建造者模式详解
- 动态链接和静态链接的区别
- 67.二叉树的中序遍历
- linux自动化
- Android—webrtc—(一,websocket)
- 史上最全的Android studio 快捷键
- JAVA序列化和反序列化
- 列表练习
- systemctl