`

构造者模式——Builder

 
阅读更多

构造者模式——Builder

  本文是《Java设计模式》Chapter15 Builder的总结。

 

一、Builder模式实践

  在本例中,用诸如以下的字符串构造Reservation对象,字符串可能不合法或者缺少某些属性。

  为了保证构造出来的Reservation对象是合法对象,引入中间对象ReservationBuilder,临时存储已经读取的属性;最终用它的方法build()来返回合法对象或者抛出异常。“将字符串逐步转化到中间对象中的工作”交给ReservationParser来做吧^_^

 

  下面展示了如何使用Builder来逐步构造合法对象

public class ShowForgiving {
    public static void main(String[] args) {
        //待转化字符串
        String sample = "Date, November 5, Headcount, 250, "
                + "City, Springfield, DollarsPerHead, 9.95, HasSite, False";
        //中间对象builder
        ReservationBuilder builder = new ForgivingBuilder();
        try {
            //转换器内部包裹中间对象;然后开始逐步构造中间对象
            new ReservationParser(builder).parse(sample);
            //尝试返回有效对象Reservation(不同builder对有效性有“容忍度”)
            Reservation res = builder.build();
            System.out.println("Forgiving builder: " + res);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

 

 其实下面代码是不重要的,这里只是为了看一下细节:

public class ReservationParser {
    private ReservationBuilder builder;

    public ReservationParser(ReservationBuilder builder) {
        this.builder = builder;
    }

    public void parse(String s) throws ParseException {
        String[] tokens = s.split(",\\s*");
        for (int i = 0; i < tokens.length; i += 2) {
            String type = tokens[i];
            String val = tokens[i + 1];

            if ("date".compareToIgnoreCase(type) == 0) {
                Calendar now = Calendar.getInstance();
                DateFormat formatter = DateFormat.getDateInstance();
                Date d = formatter.parse(val + ", " + now.get(Calendar.YEAR));
                builder.setDate(ReservationBuilder.futurize(d));
            }
            else if ("headcount".compareToIgnoreCase(type) == 0) 
                builder.setHeadcount(Integer.parseInt(val));
            else if ("City".compareToIgnoreCase(type) == 0)
                builder.setCity(val.trim());
            else if ("DollarsPerHead".compareToIgnoreCase(type) == 0) 
                builder.setDollarsPerHead(new Dollars(Double.parseDouble(val)));
            else if ("HasSite".compareToIgnoreCase(type) == 0)
                builder.setHasSite(val.equalsIgnoreCase("true"));
        }
    }
}
 

 

二、Builder模式好处(P165 Summary)

       The Builder pattern separate the construction of a  complex object from its representation. This has the immediate effect of making a complex target class simpler. It lets a builder class("ReservationBuilder") focus on the proper construction of an object, leaving the target class("Reservation") to focus on the operation of valid instance. This is especially useful when you want to ensure the validity of an object before instantiating it and don't want the associated logic to appear in the target class's constructors. A builder also accommodates step-by-step construction, which often occurs when you create an object by parsing text .

 

       简言之,Builder 模式将对象的构造过程分离出来(就好像把Ctor做成一个类似的)!通常是因为构造过程比较复杂,如:

       构造是需要考虑产生对象的有效性;需要通过解析字符串来逐步构建对象。

  • 大小: 9.5 KB
分享到:
评论

相关推荐

    创建型——Builder模式

    Builder模式是一种创建型设计模式,它提供了一种创建对象的灵活方式,将对象的构建过程与表示分离。这种模式在复杂对象的构造过程中特别有用,因为它允许我们通过不同的步骤来构造对象,而不会让客户端代码受到这些...

    设计模式——建造者模式

    - **解耦**:建造者模式将对象的构造过程与使用过程分离,使得构造过程可以独立地改变,而不会影响到使用它的客户端。 - **可扩展性**:通过增加新的具体建造者类,可以轻松地扩展产品类型,而无需修改已有代码。 - ...

    Java 设计模式-建造者模式(Builder)Android讲解

    总结来说,Java的设计模式——建造者模式在Android开发中扮演着重要角色,它帮助我们构造复杂对象,提供了一种模块化、易扩展的代码结构,提高了代码的可读性和可维护性。通过理解并熟练运用建造者模式,开发者可以...

    设计模式实现——创建者模式

    创建者模式,也被称为构造器模式,是一种设计模式,它提供了创建对象的统一接口,隔离了客户端代码与对象的创建细节,使得系统更加灵活,易于维护。这种模式主要用于当一个对象的构建与其表示分离时的情况。 创建者...

    设计模式——可复用面向对象软件的基础(3)

    《设计模式——可复用面向对象软件的基础》是IT领域中的经典著作,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师合著,他们因此被誉为GoF(Gang of Four)。这本书提出了面向对象设计的23种...

    【设计模式】- 生成器模式(Builder)(csdn)————程序.pdf

    生成器模式,也称为建造者模式,是一种设计模式,用于创建复杂对象,它允许你按照一系列步骤来构造对象,而这些步骤可以通过不同的实现来产生不同形式的对象。生成器模式的核心在于分离了对象的构造过程和表示细节,...

    《设计模式--基于C#的工程化实现及扩展》.(王翔)_《0528》.rar

    创建型模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory)和建造者模式(Builder)等,它们提供了一种灵活的方式来创建和管理对象,避免了硬编码和紧密耦合。结构型模式关注如何将对象和类组合...

    设计模式C#实例——大洋系统

    "设计模式C#实例——大洋系统"这个主题涵盖了五个经典的设计模式:抽象工厂(Abstract Factory)、适配器(Adapter)、桥接(Bridge)、建造者(Builder)以及责任链(Chain of Responsibility)。接下来,我们将...

    设计模式与泡MM——设计模式入门教程

    建造者模式关注的是如何一步步构建一个复杂的对象,将对象的构造与其表示分离,使得相同的构造过程可以创建不同的表示。 **例子**:为了让MM开心,你准备了一台可以翻译多种语言的机器,每种语言对应一个按钮,这样...

    设计模式精解——GoF23中设计模式解析

    ### 设计模式精解——GoF23中设计模式解析 #### 重要性与起源 设计模式是软件工程领域的一项重要研究,它提供了一系列解决常见软件设计问题的模板。GoF23指的是由Erich Gamma、Richard Helm、Ralph Johnson和John ...

    JavaScript设计模式之建造者模式介绍

    建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在建造者模式中,一个复杂对象的构造被分解为多个简单的步骤,并且允许使用相同的构造过程创建不同的表示。这种方式非常适用...

    C#面向对象设计模式4:生成器(Builder)

    今天我们将深入探讨其中的一种——生成器(Builder)模式。 生成器模式是一种创建型设计模式,它允许我们分步骤构建复杂对象,同时隐藏了对象组装的细节。这种模式的核心思想是将产品的构造过程与产品本身分离,使...

    设计模式源码.zip

    最后,"设计模式——基于C#的工程化实现及扩展_示例说明.txt"文件提供了对源码的解释和应用场景的描述,这对于初学者来说是极其宝贵的资源。它可以帮助你理解每个模式的意图、适用场景以及如何在C#代码中正确地引入...

    设计模式-实例代码

    本文将围绕“设计模式-实例代码”这一主题,详细讲解设计模式中的一个经典模式——建造者(Builder)模式,并结合提供的标签“源码”和“工具”,给出实际的代码实现。 建造者模式是一种创建型设计模式,它允许我们...

    C#面向对象设计模式纵横谈

    接下来,我们将进一步探索另一种创建型设计模式——Builder模式。 ### Builder模式简介 Builder模式是一种软件设计模式,它允许将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这种...

    程序设计模式实例分析

    备忘录模式用于记录和恢复对象状态,而建造者模式则用于复杂对象的构造过程。这两种模式都体现了设计模式的核心思想——通过增加抽象层,将变化的部分与不变的部分分离,从而达到代码的可复用性和可维护性。

    Java的Builder模式生成器FreeBuilder.zip

    当设计类的构造函数或静态工厂具有多个参数时,Builder 模式是一个不错的选择。—— Effective Java,第二版,第39页背景在 Java 中实现 Builder 模式容易出错和重复。即使是一个简单的四字段类,最基本的构建器 ...

    DesignPatternsDemo:Java 中的设计模式——简短示例

    4. 建造者模式(Builder Pattern): 建造者模式将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。比如,我们可以定义一个`CarBuilder`类,它包含步骤来组装汽车的不同部分,然后根据需要...

    设计模式C++ 06-10

    5. **观察者模式(Observer Pattern)** - 最后,10.pdf可能涵盖的是行为型设计模式——观察者模式。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这...

Global site tag (gtag.js) - Google Analytics