文档章节

Java设计模式之建造者模式

断桥残雪断桥残雪
 断桥残雪断桥残雪
发布于 2015/08/13 16:30
字数 869
阅读 90
收藏 4

建造者模式简介

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

建造者模式的设计方法

建造者模式通常有四个结构主体,它们分别是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	张三已经上线





© 著作权归作者所有

断桥残雪断桥残雪
粉丝 53
博文 139
码字总数 94909
作品 0
广州
程序员
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
293
0
java中23种设计模式(上)

参考网址:http://blog.csdn.net/zhangerqing 资源:http://download.csdn.net/detail/zhangerqing/4835830 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用、多数...

青涩的梦
2018/06/26
0
0
Java之美[从菜鸟到高手演变]之设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

只想一个人静一静
2014/02/25
233
2
java 23种设计模式 深入理解

以下是学习过程中查询的资料,别人总结的资料,比较容易理解(站在各位巨人的肩膀上,望博主勿究) 创建型 抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html ...

wc_飞豆
2018/03/16
182
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
2018/10/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PCB设计-Allegro软件入门系列-allegro环境变量和快捷键

Allegro作为一款高速PCB设计的EDA软件,有完善的约束规则设计和信号完整性电源完整性仿真等各种专业工具深受电子行业从业者喜爱。 对于该软件来说,电子从业者接触最多的就是Allegro的画板功...

demyar
20分钟前
4
0
腾讯云存储

1、进入腾讯云平台,创建 2、进入配置查看域名 3、查看KEY参数 4、将2、3中的参数录入到cms后台 然后点测试按钮查看情况

迅睿CMS-PHP开源CMS程序
21分钟前
4
0
ES 6.x 版本 待验证的CURL命令查询操作

1. 查询数据 curl -H "Content-Type: application/json" -XGET http://elastic:123456@127.0.0.1:9200/alias1/_search -d '{"query": {"match_all": {}}}' 2. 添加数据 如果有不指定ID可以自......

coord
29分钟前
3
0
如何写好论文摘要:研究人员不得不知的小秘诀

我们为何要写摘要? 它的目的为何? 简而言之,摘要的目的就是简单的讨论这篇文章让读者更容易的了解这篇文。 它能在读者与作者之间搭起一条桥梁。当您搜索信息时,您无法一下阅读整篇文章,...

论文辅导员
32分钟前
3
0
移动端、PC端(前后台)、小程序常用的UI框架

移动端、PC端(前后台)、小程序常用的UI框架 1.移动端UI库 ①.Vant UI 官方地址:https://youzan.github.io/vant/#/zh-CN/intro github地址:https://github.com/youzan/vant 优点:用来做移...

jason_kiss
32分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部