- 浏览: 341314 次
- 性别:
- 来自: 广州
文章分类
最新评论
一:什么是产品内部表象和建造模式
一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户端不需要知道所生成的产品对象有哪些零件,每个产品对应的零件彼此有何不同,是怎么建造出来的,以及怎么样组成产品.即:
建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程具有不同的内部表象的不同产品对象.
二:对象性质的建造
有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,比如,一个电子邮件有发件人地址,收件人地址,主题,内容,附录等部分,而在最起码的收件人地址得到赋值之前,这人电子邮件不能发出。有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义,在某个性质没有赋值之前,另一个性质无法赋值,这些情况使得性质本身的建造涉及到复杂的商业逻辑,这时候,此对象相当于一有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程是建造零件的过程,由于建造零件的过程复杂,因此,这些零件的建造过程往往被"外部化"到另一个称作建造者的对象里,建造者对象返回给客户端的是一个全部零件都建造完毕的产品对象。
三:建造模式中的角色
此模式涉及到四种角色,它们分别是:
A:抽象建造者(Builder)角色--给出一个抽象接口,以规范产品对象的各个组成成分的建造,此接口独立于应用程序的商业逻辑,模式中直接创建产品对象的是具体建造者(ConcreateBuilder)角色,具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(源码中的builderPart1和buildPart2),另一种是结果返回方法(源码中的retrieveResult),一般来说,产品所包含的零件数目与建造方法的数据相符,换言之,有多少零件,就有多少相应的建造方法
B:具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例,这个角色要完成的任务包括:
(1)实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作
(2)在建造过程完成后,提供产品的实例。
(3)导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象,应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色
(4)产品(Product)角色:一个系统中会有多于一个的产品类,这些产品类并不一定有共同的接口.
以上四个角色中,导演者角色是与客户端打交道的角色,导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体的建造者角色。一般来说,每有一个产品类,就有一个相应的具体建造者类,这些产品应当有一样的数目的零件,而每一个零件就相应地在所有的建造者角色里有一个建造方法
四:源码
上面的系统中只有一个产品类Prodcut,对应也只一个具体建造者类ConcreteBuilder,如果有两个产品类的话就应当有两个具体建造者类.....客户端通过建造者接口生成具有不同的内部表旬的Product1和Product2的对象。
五:标识接口的应用.
由上面的例子知道,retrieveProduct()方法是抽象建造角色提供的,如果它返回的是Product1类型或者Product2类型,那么ConcreteBuilder1或者ConcreteBuilder2就会有问题,因为它们应当返回Product1和Product2类型,解决的方案是为两个具体的类提供一个共同的接口,形成它们共同的类型,由于建造模式的产品类往往是没有太多关系的一些类,因此,它们也不太可能有共同的接品,这样使用一个标识接口为所有的具体产品类提供一个共同的类型就成为解决问题的方案,即所有的retrieveProduct方法都返回Product类型就可以了。
六:JavaMail中的建造模式
跳过
七:一个发送邮件的例子
跳过
八:在什么情况下使用建造模式
A:需要生成的产品对象有复杂的内部结构,每一个内部成分本身可以是对象,也可以仅仅是一个对象的一个组成万分。
B:需要生成的产品对象的属性相互依赖,建造模式可以强制实行一种分步骤进行的建造过程,因此,如果一个产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式是一个很好的设计思想
九:建造模式与其他模式的关系
A:建造模式与抽象工厂模式的区别
在抽象工厂模式中,每一次工厂对象被调用时都返回一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会。建造模式则不同,它一点一点地建造出一个复杂的产品,而这个产品的组装过程就发生在建造者角色内部。建造模式的客户端拿到的是一个完整的最后产品。换言之,虽然抽象工厂模式与建造模式都是设计模式,但是抽象工厂模式处在更加具体的尺度上,而建造模式则处于更加宏观的尺度上。一个系统可以由一个建造者模式和一个抽象工厂模式组成,客户端通过调用这个建造角色,间接地调用另一个抽象工厂模式的工厂角色,工厂模式返回不同产品族的零件,而建造者模式则把它们组装起来.
B:建造模式与策略模式的区别
建造模式是策略模式的一种特殊情况,这两种模式的区别在于它们的用意不同.建造模式适用于为客户端一点一点地建造新的对象,而不同类型的具体建造者角色虽然都拥有相同的接口,但是它们所创建出来的对象则可能完全不同。策略模式的目的是为算法提供抽象的接口,换言之,一个具体的策略类把一个算法包装到一个对象里,而不同的具体策略对象为一种一般性的服务提供不同实现.
请你用建造模式解决下面一首女子写给丈夫的情诗:
一别之后,两地相思,三月桃花随水转,四月琵琶未黄,奴我欲对镜心却乱,五月石榴红似火,偏遇冷雨浇花端。六月伏天人人摇扇独我心寒。七弦琴无心弹,八行书无处传,九连环从中折断,十里长庭望眼欲穿.
提示:
导演者:丈夫建造者:妻子产品:思念
一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户端不需要知道所生成的产品对象有哪些零件,每个产品对应的零件彼此有何不同,是怎么建造出来的,以及怎么样组成产品.即:
建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程具有不同的内部表象的不同产品对象.
二:对象性质的建造
有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,比如,一个电子邮件有发件人地址,收件人地址,主题,内容,附录等部分,而在最起码的收件人地址得到赋值之前,这人电子邮件不能发出。有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义,在某个性质没有赋值之前,另一个性质无法赋值,这些情况使得性质本身的建造涉及到复杂的商业逻辑,这时候,此对象相当于一有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程是建造零件的过程,由于建造零件的过程复杂,因此,这些零件的建造过程往往被"外部化"到另一个称作建造者的对象里,建造者对象返回给客户端的是一个全部零件都建造完毕的产品对象。
三:建造模式中的角色
此模式涉及到四种角色,它们分别是:
A:抽象建造者(Builder)角色--给出一个抽象接口,以规范产品对象的各个组成成分的建造,此接口独立于应用程序的商业逻辑,模式中直接创建产品对象的是具体建造者(ConcreateBuilder)角色,具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(源码中的builderPart1和buildPart2),另一种是结果返回方法(源码中的retrieveResult),一般来说,产品所包含的零件数目与建造方法的数据相符,换言之,有多少零件,就有多少相应的建造方法
B:具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例,这个角色要完成的任务包括:
(1)实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作
(2)在建造过程完成后,提供产品的实例。
(3)导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象,应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色
(4)产品(Product)角色:一个系统中会有多于一个的产品类,这些产品类并不一定有共同的接口.
以上四个角色中,导演者角色是与客户端打交道的角色,导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体的建造者角色。一般来说,每有一个产品类,就有一个相应的具体建造者类,这些产品应当有一样的数目的零件,而每一个零件就相应地在所有的建造者角色里有一个建造方法
四:源码
package cai.milenfan.basic.test; public class Director { private Builder builder; //产品构造方法,负责调用各个零件建造方法 public void construct(){ builder = new ConcreteBuilder(); builder.buildPart1(); builder.buildPart2(); builder.retrieveResult(); //other code........... } }
package cai.milenfan.basic.test; //抽象建造者通常与应用系统的商业逻辑无关,因此可以用java的抽象类或接口 abstract public class Builder { //产品零件建造方法 public abstract void buildPart1(); public abstract void buildPart2(); //产品返回方法 public abstract Product retrieveResult(); }
package cai.milenfan.basic.test; //具体建造者是与应用系统的商业逻辑密切相关的,因此这里仅仅给出了一个骨架 public class ConcreteBuilder extends Builder{ private Product product = new Product(); public void buildPart1() { //your code........... } public void buildPart2() { //your code.... } public Product retrieveResult() { return product; } }
package cai.milenfan.basic.test; public class Product { //it is your product...... }
上面的系统中只有一个产品类Prodcut,对应也只一个具体建造者类ConcreteBuilder,如果有两个产品类的话就应当有两个具体建造者类.....客户端通过建造者接口生成具有不同的内部表旬的Product1和Product2的对象。
五:标识接口的应用.
由上面的例子知道,retrieveProduct()方法是抽象建造角色提供的,如果它返回的是Product1类型或者Product2类型,那么ConcreteBuilder1或者ConcreteBuilder2就会有问题,因为它们应当返回Product1和Product2类型,解决的方案是为两个具体的类提供一个共同的接口,形成它们共同的类型,由于建造模式的产品类往往是没有太多关系的一些类,因此,它们也不太可能有共同的接品,这样使用一个标识接口为所有的具体产品类提供一个共同的类型就成为解决问题的方案,即所有的retrieveProduct方法都返回Product类型就可以了。
六:JavaMail中的建造模式
跳过
七:一个发送邮件的例子
跳过
八:在什么情况下使用建造模式
A:需要生成的产品对象有复杂的内部结构,每一个内部成分本身可以是对象,也可以仅仅是一个对象的一个组成万分。
B:需要生成的产品对象的属性相互依赖,建造模式可以强制实行一种分步骤进行的建造过程,因此,如果一个产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式是一个很好的设计思想
九:建造模式与其他模式的关系
A:建造模式与抽象工厂模式的区别
在抽象工厂模式中,每一次工厂对象被调用时都返回一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会。建造模式则不同,它一点一点地建造出一个复杂的产品,而这个产品的组装过程就发生在建造者角色内部。建造模式的客户端拿到的是一个完整的最后产品。换言之,虽然抽象工厂模式与建造模式都是设计模式,但是抽象工厂模式处在更加具体的尺度上,而建造模式则处于更加宏观的尺度上。一个系统可以由一个建造者模式和一个抽象工厂模式组成,客户端通过调用这个建造角色,间接地调用另一个抽象工厂模式的工厂角色,工厂模式返回不同产品族的零件,而建造者模式则把它们组装起来.
B:建造模式与策略模式的区别
建造模式是策略模式的一种特殊情况,这两种模式的区别在于它们的用意不同.建造模式适用于为客户端一点一点地建造新的对象,而不同类型的具体建造者角色虽然都拥有相同的接口,但是它们所创建出来的对象则可能完全不同。策略模式的目的是为算法提供抽象的接口,换言之,一个具体的策略类把一个算法包装到一个对象里,而不同的具体策略对象为一种一般性的服务提供不同实现.
请你用建造模式解决下面一首女子写给丈夫的情诗:
一别之后,两地相思,三月桃花随水转,四月琵琶未黄,奴我欲对镜心却乱,五月石榴红似火,偏遇冷雨浇花端。六月伏天人人摇扇独我心寒。七弦琴无心弹,八行书无处传,九连环从中折断,十里长庭望眼欲穿.
提示:
导演者:丈夫建造者:妻子产品:思念
发表评论
-
Mina重连
2014-05-26 21:29 2927import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6431.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 623一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 809安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1252使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 483ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1177http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 913不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 890http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 507http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 996http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 692http://code.google.com/p/cshbbr ... -
将Java程序注册成系统服务(NT服务)
2013-03-16 16:14 604http://blog.csdn.net/small____f ... -
Java内存回收机制
2013-03-13 15:47 814http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 975http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 437http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 592http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 839当Server没接受到一个Client连接请求之后,都把处理流 ... -
Java 多线程的一个例子
2012-10-09 09:48 1024目录: 1 synchronized的 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ...
相关推荐
所有的设计模式Java实现。 第一讲:简单工厂模式 第二讲:工厂方法模式 第三讲:抽象工厂模式 ...第二十七讲:里氏转换原则 第二十八讲:依赖倒转原则 第二十九讲:迪米特法则 第三十讲:设计模式总结
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...
无水印、可复制版本 一、原型模式 二、单例模式 三、工厂方法模式 四、建造者模式 五、适配器模式 六、桥接模式 七、组合模式 八、装饰器模式 九、外观模式 十、享元模式 十一、代理模式 ...二十二、访问者模式
22第二十二讲备忘录模式 23第二十三讲状态模式 24第二十四讲命令模式 25第二十五讲访问者模式 26第二十六讲开放封闭原则 27第二十七讲单一职责原则 28第二十八讲里氏代换原则 29第二十九讲依赖倒转原则 30第三十讲...
在书中,作者们将这二十三种设计模式分成了三类,分别是创建型模式、结构型模式和行为型模式。 创建型模式包含了: 工厂方法模式( Factory Method ) 抽象工厂模式( Abstract Factory ) 单例模式( Singleton ...
(二)策略模式:策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,让算法的变化独立于使用它的客户。与工厂模式结合,可以根据策略动态地创建和切换行为。 (三)装饰模式:装饰模式在不改变...
设计模式(七)-建造者模式 博客地址: : 08.设计模式(八)-原型模式 博客地址: : 09.设计模式(九)-单例模式 博客地址: : 10.设计模式(十)-适配器模式 博客地址: : 11.设计模式(十一)-合理模式 ...
(一)简单工厂模式 2 (二)策略模式 4 策略与工厂结合 6 单一职责原则 6 开放――封闭原则 6 里氏代换原则 7 依赖倒转原则 7 (三)装饰模式 7 (四)代理模式 9 (五)工厂方法模式 11 ...(二十四)访问者模式 61
- 第十七章:观察者模式 - 第十八章:命令模式 - **翻译团队**:本书的中文版由PHPChina成员翻译完成,各章节分别由不同的译者负责。 #### 五、设计模式案例分析 - **单例模式**:确保类只有一个实例,并提供一个...
二、工厂模式(Factory) 工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。C#中的 Activator.CreateInstance() 方法可以作为简单工厂的实现,而更复杂的抽象工厂模式则...
#### 二、建造者模式(Builder) **定义:** 建造者模式是一种创建型设计模式,允许逐步构建复杂对象。该模式允许用户只通过指定复杂对象的类型和内容就可以构建它们,而不需要知道内部的具体构建细节。 **应用...
#### 二、设计模式的基本定义 **什么是设计模式?** 设计模式是一种在特定情境下解决问题的标准化方案,这些解决方案通常在实际开发过程中被多次验证和改进。设计模式的目标是提高代码的复用性、灵活性和可维护性。...
**原则二十七:** 当需要频繁更新多个观察者时,使用观察者模式可以显著提高性能。避免在每次更新时都遍历所有观察者列表。 **原则二十八:** 在使用观察者模式时,考虑使用代理对象来封装观察者与被观察者之间的...
二、工厂模式 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在Java中,工厂模式通过创建一个工厂类来生产不同类型的对象,避免了客户代码与具体产品类之间的耦合。 三、抽象工厂模式 抽象工厂...
二十、代理模式 代理模式为其他对象提供一种代理以控制对这个对象的访问。代理模式相当于为对象提供了一个“代言人”,从而控制对原始对象的访问,达到某种目的。 二十一、享元模式 享元模式是一种结构型设计模式,...
#### 二、工厂模式(Factory) **定义**:工厂模式是一种创建型设计模式,其目的是为了封装创建对象的过程。当创建对象的过程比较复杂或者需要根据不同的条件创建不同的对象时,可以使用工厂模式。 **应用场景**:...
#### 原则二十七:使用观察者模式 - **描述**:当一个对象的状态改变时,其所有依赖的对象都会得到通知。 - **应用**:适用于需要实时更新多个对象状态的场景。 #### 原则二十八:避免过多观察者 - **描述**:过多...
#### 二、建造者模式 **定义**: 建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它是用于创建复杂的对象,尤其是对象的创建过程非常复杂或者对象包含很多组成部分时。 **...
十、建造者模式 建造者模式将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。C#中可以使用多个构造函数或工厂方法来实现建造者模式。 十一、模板方法模式 模板方法模式定义了一个操作中的算法...
二、工厂模式(Factory) 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在Java中,简单工厂、工厂方法和抽象工厂模式各有不同的适用场景,可以避免硬编码类名,提高代码的灵活性。 三、建造者...