- 浏览: 532992 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
构造者模式——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做成一个类似的)!通常是因为构造过程比较复杂,如:
构造是需要考虑产生对象的有效性;需要通过解析字符串来逐步构建对象。
发表评论
-
(第十章)一个xml解析器和构造器
2013-03-10 16:40 897本章的前两节“10.1 状态机”、“10.2 ... -
享元模式——Flyweight
2012-02-17 13:10 1013享元模式——Flyweig ... -
工厂方法和抽象工厂——Factory Method & Abstract Factory
2012-01-04 17:14 2049一、使用抽象工厂和工厂方法 Factory Me ... -
单例模式——Singleton
2012-01-04 17:08 975public class Singleton { ... -
观察者模式——Observer
2012-01-04 16:25 1280观察者模式—— Observer ... -
适配器模式——Adaptor(Adapter)
2012-01-01 18:23 1367适配器模式 —— Adapto ... -
状态模式——State (更好的实现状态机)
2011-12-28 14:10 655801. 概述 The intent o ... -
装饰者模式——Decorator
2011-12-25 11:11 1140装饰者模式—— Decorator ... -
组合模式——Composite
2011-12-24 14:27 9731. Composite 定义 : ... -
责任链模式——Chain of Responsibility
2011-08-10 11:26 892一、总结《Java设计模式》Chapter12 Chain o ... -
代理模式Dynamic Proxies(四、Struts2.0拦截器Interceptor)
2011-08-01 11:31 1378一、概念和注意点: Once you write a d ... -
代理模式Remote Proxies(三、RMI)
2011-08-01 09:51 1665因为我本科毕业设计中大量采用RMI实现分布式,且使用了Ecli ... -
代理模式Image Proxies(二、最朴素实现)
2011-07-31 11:55 955在前面《 代理模式Image Proxies(一、最朴素实现) ... -
命令模式——Command
2011-06-10 10:31 911偷懒一下,直接用JavaEye上chjavach老兄的文章了, ... -
代理模式Image Proxies(一、最朴素实现)
2011-06-03 09:27 1022A Classic Example: Image Prox ... -
策略模式——strategy
2011-06-02 12:36 847Strategy Pattern ...
相关推荐
NULL 博文链接:https://quicker.iteye.com/blog/587588
【设计模式】- 生成器模式(Builder)(csdn)————程序
设计模式C++学习之建造者模式(Builder)
Builder模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 统设计中,有时候面临着一个“复杂系统”的创建工作,该对象通常由各个部分的子对象用一定的算法构成,或者说按一定的...
建造者模式【Builder Pattern】(二)问题改进
本人理解的builder模式
建造者模式【Builder Pattern】(一)问题提出
Java 设计模式-建造者模式(Builder)结合Android小知识讲解,简单明了
数据库应用技术——PowerBuilder应用系统开发
processing库文件——3D开发的Modelbuilder库,下载文件解压到processing安装目录library文件夹内即可。
23种设计模式之四(创建型模式)Builder模式
3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. ...
使用c++ builder控件实现观察者模式
建造者模式【Builder Pattern】(三)问题引申
建造者模式【Builder Pattern】(一)问题改进
数据库系统原理与应用实训教程——PowerBuilder & SQL Server版》源代码.asp.exe
NULL 博文链接:https://wy649898543.iteye.com/blog/1431751
C#设计模式之建造者(Builder)模式示例源代码
将一个复杂对象的构造与它的表示分离,使同样的构建 过程可以创建不同的表示,这样的设计模式被称为建造者模式。
Builder模式 设计模式 Builder模式