码迷,mamicode.com
首页 > 编程语言 > 详细

Java设计模式之建造者模式

时间:2015-08-13 18:21:53      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

建造者模式简介

建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。换句话说,建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

建造者模式的设计方法

建造者模式通常有四个结构主体,它们分别是Director,Builder,ConcreteBuilder,Product。每个主体所起的作用不一样,下面分别说说它们的作用。

Director的作用

构造一个使用Builder抽象接口的对象,即使用一个Builder对象来构造一个Director对象。

Builder的作用

为创建一个Product对象的各个部件指定抽象接口,即定义一些公共部分。

ConcreteBuilder的作用

实现Builder的公共接口以构造产品的各个零部件;

定义并明确它所创建的表示;

提供一个获取产品的接口,例如get方法;

Product的作用

表示被构造的复杂对象,包含定义部件的类,并将这些部件装配成最终的产品。

建造者模式的示例代码

示例介绍

下面将通过一个消息推送功能来掩饰建造者模式的应用,先在有两种消息,一种是上线提醒,另外一种是离线提醒。消息的内容是时间:****  某人已经上线(或下线)!首先,我们新建消息类,由于消息体大致相同,因此我们先定义一个公共的抽象消息,然后让两种具体的消息继承这个抽象类,可以实现部分代码共享。

抽象消息


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="已经下线";
	}
}



然后我们创建一个Builder接口,里面定义创建姓名、日期的公共方法,并且定义一个获取通知的方法。


Builder接口


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(); 
}



接着我们创建两个具体的Builder对象,实现Builder接口。


两个ConcreteBuilder类


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;
	}

}




Director类

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	张三已经上线





Java设计模式之建造者模式

标签:

原文地址:http://my.oschina.net/zzw922cn/blog/491923

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!