标签:
建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。换句话说,建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
建造者模式通常有四个结构主体,它们分别是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