标签:
建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。换句话说,建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
建造者模式通常有四个结构主体,它们分别是Director,Builder,ConcreteBuilder,Product。每个主体所起的作用不一样,下面分别说说它们的作用。
构造一个使用Builder抽象接口的对象,即使用一个Builder对象来构造一个Director对象。
为创建一个Product对象的各个部件指定抽象接口,即定义一些公共部分。
实现Builder的公共接口以构造产品的各个零部件;
定义并明确它所创建的表示;
提供一个获取产品的接口,例如get方法;
表示被构造的复杂对象,包含定义部件的类,并将这些部件装配成最终的产品。
下面将通过一个消息推送功能来掩饰建造者模式的应用,先在有两种消息,一种是上线提醒,另外一种是离线提醒。消息的内容是时间:**** 某人已经上线(或下线)!首先,我们新建消息类,由于消息体大致相同,因此我们先定义一个公共的抽象消息,然后让两种具体的消息继承这个抽象类,可以实现部分代码共享。
package com.builder;
/**
* 通知抽象类
*/
import java.util.Date;
public abstract class AbstractNotification {
private String subject;
private Date date;
protected String content;
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getContent() {
return content;
}
public void send() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("时间:");
stringBuilder.append(this.getDate());
stringBuilder.append("\t");
stringBuilder.append(this.getSubject());
stringBuilder.append(this.getContent());
System.out.println(stringBuilder.toString());
}
}
package com.builder;
public class OnlineNotification extends AbstractNotification {
public OnlineNotification() {
this.content="已经上线";
}
}
package com.builder;
public class OfflineNotification extends AbstractNotification {
public OfflineNotification() {
this.content="已经下线";
}
}
package com.builder;
import java.util.Date;
public interface Builder {
public abstract void buildSubject(String subject);
public abstract void buildDate(Date date);
public abstract AbstractNotification getNotification();
}
package com.builder;
import java.util.Date;
public class OnlineNotificationBuilder implements Builder {
private AbstractNotification abstractNotification;
public OnlineNotificationBuilder() {
abstractNotification=new OnlineNotification();
}
@Override
public void buildSubject(String subject) {
abstractNotification.setSubject(subject);
}
@Override
public void buildDate(Date date) {
abstractNotification.setDate(date);
}
@Override
public AbstractNotification getNotification() {
return abstractNotification;
}
}
package com.builder;
import java.util.Date;
public class OfflineNotificationBuilder implements Builder {
private AbstractNotification abstractNotification;
public OfflineNotificationBuilder() {
abstractNotification=new OfflineNotification();
}
@Override
public void buildSubject(String subject) {
abstractNotification.setSubject(subject);
}
@Override
public void buildDate(Date date) {
abstractNotification.setDate(date);
}
@Override
public AbstractNotification getNotification() {
return abstractNotification;
}
}
package com.builder;
import java.util.Date;
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct(String subject,Date date) {
builder.buildSubject(subject);
builder.buildDate(date);
AbstractNotification notification = builder.getNotification();
notification.send();
}
}
package com.builder;
import java.util.Date;
public class Test {
public static void main(String[] args) {
Builder onlineNotificationBuilder = new OnlineNotificationBuilder();
Director director = new Director(onlineNotificationBuilder);
director.construct("张三", new Date());
}
}
时间:Thu Aug 13 16:07:58 CST 2015 张三已经上线
标签:
原文地址:http://my.oschina.net/zzw922cn/blog/491923