菜鸟成长系列-概述
菜鸟成长系列-面向对象的四大基础特性
菜鸟成长系列-多态、接口和抽象类
菜鸟成长系列-面向对象的6种设计原则
菜鸟成长系列-单例模式 菜鸟成长系列-工厂模式java
建造者模式也是建立型中的一种,用于负责建立对象。建造者模式能够将一个产品的内部表象与产品的生成过程分割开来,从而可使一个建造过程生成具备不一样的内部表象的产品对象。
bash
一个产品常有不用的组成成分做为产品的零件,这些零件有多是对象,也有可能不是对象,他们一般又叫作产品的内部表象。不一样的产品能够有不一样的内部表象,也就是能够有不一样的零件。使用建造者模式可使客户端不须要知道所生成的产品对象有哪些零件,每一个产品的对应零件彼此有何不一样,是怎么建造出来的,以及怎样组成产品。session
上一篇咱们讨论了工厂模式,咱们知道工厂模式通常都是建立一个产品,注重的是把这个产品建立出来就行,只要建立出来,不关心这个产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。那么对于建造者模式呢? 建造者模式也是建立一个产品,可是不只要把这个产品建立出来,还要关系这个产品的组成细节, 组成过程。从代码上看(下面给出),建造者模式在建造产品时,这个产品有不少方法,建造者模式会根据这些相同方法可是不一样执行顺序建造出不一样组成细节的产品。app
Director角色是与客户端打交道的角色。Director将客户端建立产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体的ConcreteBuilder角色。ConcreteBuilder是作具体建造工做的,可是对客户端是透明的。ide
通常来讲,每有一个产品类,就有一个相应的具体建造者类。这些产品应当有同样数目的零件,而每有一个零件就相应的在全部的建造者角色里有一个建造方法。post
经过代码来看下各个角色的职责:ui
package com.glmapper.model.builder;
/**
*
* 导演者类
* @author glmapper
* @time 2017年12月30日上午11:33:26
* @version glmapper_v1.0
*
*/
public class Director {
private Builder builder;
/**
* 产品构造方法,负责调用各个零件建造方法
*/
public EmailProduct construct(){
builder = new ConcreteBuilder();
builder.buildFromAddress();
builder.buildToAddress();
builder.buildSubject();
builder.buildContent();
builder.buildSupplement();
return builder.returnEmailProduct();
}
}
复制代码
package com.glmapper.model.builder;
/**
* 抽象建造者 提供不一样的构建组件方法
* @author glmapper
* @time 2017年12月30日上午11:31:34
* @version glmapper_v1.0
*
*/
public interface Builder {
/**
* 构建发件人信息
*/
public void buildFromAddress();
/**
* 构建收件人信息
*/
public void buildToAddress();
/**
* 构建邮件内容
*/
public void buildContent();
/**
* 构建邮件附件
*/
public void buildSupplement();
/**
* 构建邮件主题
*/
public void buildSubject();
/**
* 返回构建的产品
*/
public EmailProduct returnEmailProduct();
}
复制代码
package com.glmapper.model.builder;
/**
*
* 具体产品的建造器
* @author glmapper
* @time 2017年12月30日上午11:31:11
* @version glmapper_v1.0
*
*/
public class ConcreteBuilder implements Builder{
private EmailProduct emailProduct = new EmailProduct();
public void buildFromAddress() {
emailProduct.setFromAddress("00001111@glmapper.com");
}
public void buildToAddress() {
emailProduct.setToAddress("00001112@glmapper.com");
}
public void buildContent() {
emailProduct.setContent("我写了一个建造者模式的例子,但愿大佬给点意见");
}
public void buildSupplement() {
emailProduct.setSupplement("附件:BuilderDemo.rar");
}
public void buildSubject() {
emailProduct.setSubject("给大佬的一封建造者模式的Demo");
}
public EmailProduct returnEmailProduct() {
System.out.println(emailProduct.toString());
return emailProduct;
}
}
复制代码
package com.glmapper.model.builder;
/**
* 产品类(产品类中包括不一样组件:此处使用字段方式模式组件)
* @author glmapper
* @time 2017年12月30日上午11:30:13
* @version glmapper_v1.0
*
*/
public class EmailProduct {
/**
* 发件地址
*/
private String fromAddress;
/**
* 收件地址
*/
private String toAddress;
/**
* 邮件主题
*/
private String subject;
/**
* 邮件内容
*/
private String content;
/**
* 邮件附件
*/
private String supplement;
public String getFromAddress() {
return fromAddress;
}
public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}
public String getToAddress() {
return toAddress;
}
public void setToAddress(String toAddress) {
this.toAddress = toAddress;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSupplement() {
return supplement;
}
public void setSupplement(String supplement) {
this.supplement = supplement;
}
@Override
public String toString() {
return "EmailProduct [fromAddress=" + fromAddress + ", toAddress=" + toAddress + ", subject=" + subject
+ ", content=" + content + ", supplement=" + supplement + "]";
}
}
复制代码
package com.glmapper.model.builder;
/**
* 客户端
* @author glmapper
* @time 2017年12月30日上午11:45:53
* @version glmapper_v1.0
*
*/
public class MainTest {
public static void main(String[] args) {
new Director().construct();
}
}
复制代码
建造发件人信息组件...
建造收件人信息组件...
建造邮件主题信息组件...
建造邮件内容信息组件...
建造邮件附件信息组件...
(为了方便看,这里把结果的显示作了调整)
EmailProduct :
[
fromAddress=00001111@glmapper.com,
toAddress=00001112@glmapper.com,
subject=给大佬的一封建造者模式的Demo,
content=我写了一个建造者模式的例子,但愿大佬给点意见,
supplement=附件:BuilderDemo.rar
]
复制代码
有些状况下,一个对象会有一些重要的性质,在他们没有恰当的值以前,对象不能做为一个完整的产品来使用。就如上面发送一个电子邮件所示,电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在收件人地址没有赋值以前,这个电子邮件是不能发送的。在某些状况下,一个对象的一些性质必须按照某个顺序赋值才有意义,在某个性质没有赋值以前,另外一个性质则没法赋值。这些状况使得性质自己的建造涉及到复杂的业务逻辑。this
而此时,对象至关于一个有待建造的产品,而对象的这些性质至关于产品的零件,建造产品的过程是建造零件的过程。因为建造零件的过程很复杂,所以,这些零件的健在过程每每会被“外部化”到另外一个称做为建造者的对象里,建造者对象返回给客户端的是一个所有零件都建造完毕的产品对象。spa
在实际的应用过程当中,建造者模式也有不一样的变种,好比说省略抽象建造者角色或者省略导演者角色等等,在某些状况下,建造者模式能够经过省略某些角色来达到过分到模板方法模式。设计
OK,关于建造者模式的其余变种这里就不讨论了,留一个想象空间!(这段字表明一个微笑的表情(* ̄︶ ̄))
JavaMail是一组J2SE的扩展API的一个类库,咱们可使用这个API来开发一个功能完备的电子邮件客户端软件。在JavaMail中就主要使用了建造者模式,固然还有咱们上一篇中说道的抽象工厂模式。
package com.glmapper.model.builder;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
* 邮件发送-建造者模式
* @author glmapper
* @time 2017年12月30日下午2:04:46
* @version glmapper_v1.0
*
*/
public class MailSender {
private static MimeMessage message;
public static void main(String[] args) {
//基本属性
String smptHost = "smpt.xxx.com";
String fromAddress = "00001111@glmapper.com";
String toAddress = "00001112@glmapper.com";
Properties p= new Properties();
p.put("mail.smtp.host", smptHost);
Session session = Session.getDefaultInstance(p);
try {
InternetAddress to = new InternetAddress(toAddress);
InternetAddress from = new InternetAddress(fromAddress);
//建立message对象
message = new MimeMessage(session);
//下面就是组装零件的过程
message.setFrom(from);
message.setRecipient(Message.RecipientType.TO, to);
message.setSubject("hello builder");
message.setText("我写了一个建造者模式的例子,但愿大佬给点意见");
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
复制代码
OK,建造者模式就到这里了,你们元旦快乐!