《java与模式》学习系列——建造者模式

 

一、 建造(Builder)模式结构图

建造者模式将产品的结构和产品的零件建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割分开,达到责任划分和封装的目的。

建造模式利用一个导演者对象和具体建造者对象一个一个的建造出所有零件,从而建造出完整的产品对象。

结构图如下:

《java与模式》学习系列——建造者模式_第1张图片

《java与模式》学习系列——建造者模式_第2张图片

二、 建造模式在java中的应用

JavaMail中的建造模式

JavaMail是一组J2SE的扩展API的一个类库,设计师可以使用它很容易的开发出功能齐备的客户端电子邮件软件。

JavaMail中的MessageMimeMessage等类均是退化的建造模式的应用。作为客户端和导演对象,MailSender通过一步步的提供MimeMessage对象的“零件”性质,也就是fromrecipientsubjecttext等,最后得到整个的产品对象,也就是MimeMessage对象。

代码如下:

public class MailSender { private static MimeMessage message; public static void main(String args[]){ //你的smtp服务器地址 String smtpHost = "smtp.mycompany.com" ; //发送者的地址 String from ="[email protected]"; //收件人的地址 String to = "[email protected]"; Properties props = new Properties(); props.put("mail.smtp.host", smtpHost); Session session= Session.getDefaultInsatance(props,null); try{ InternetAddress[] address = {new InternetAddress(to)}; //创建message对象 message = new MimeMessage(session); //建造发件人位元址零件 message.setFrom(new InternetAddress(from)); //建造收件人位元址零件 message.setReipients(Message.RecipientType.TO,address); //建造主题零件 mesage.setSubject("Hello from Jeff"); //建造发送时间零件 message.setSentDate(new Date()); //建造内容零件 message.setText("Hello,how are things going?"); //发送邮件,相当于产品返还方法 Transport.send(message); System.out.println("email has been sent"); }catch(Exception e){ System.out.println(e); } } } 

三、 在什么情况下使用建造者模式

1、  需要生成的产品对象有复杂的内部结构。每一个内部成分本身可以是对象,也可以是一个对象(即产品对象)的一个组成部分。

2、  需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式便是一个很好的设计思想。

3、  在对象创建过程中会使用到系统中的其他一些对象,这些产品对象的创建过程不易得到。

四、 建造模式与其他模式的关系

建造模式与抽象工厂模式的区别

在抽象工厂模式中,每一次工厂对象被调用时都会返还一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会。建造类则不同,它一点一点的建造出一个复杂的产品,而这个产品的组装过程就发生在建造者角色内部。建造者模式的客户端拿到的是一个完整的最后产品。

换言之,虽然抽象工厂模式与建造模式都是设计模式,但是抽象工厂模式处在更加具体的尺度,而建造模式则处于更加宏观的尺度上。一个系统可以有一个建造模式和一个抽象工厂模式组成,客户端通过调用这个建造角色,间接的调用另一个抽象工厂模式的工厂角色。工厂模式返还不同产品组的零件,而建造者模式则把它们组装起来。

建造模式与策略模式

建造模式在结构上很接近于策略模式,事实上建造模式是策略模式的一种特殊情况,这两种模式的区别在于他们的用意不同。建造模式适用于为客户端一点一点的建造新的对象,而不同类型的具体建造者角色虽然都拥有相同的接口,但是他们所创建出来的对象则可能完全不同。

策略模式的目的是为算法提供抽象的接口。换言之,一个具体策略类把一个算法包装到一个对象里面,而不同的具体策略对象为一种一般性的服务提供不同的实现。

 

你可能感兴趣的:(设计模式)