23种设计模式之Builder设计模式
概述
建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。
本质
分离了对象子组件的单独构造(由Builder来单独负责)和装配(由Director来负责)从而构造出复杂的对象,从而实现了构造和装配的解耦,不同构造器相同装备装配也可以做出不同的对象;相同构造器不同装配顺序也可以做好受不同的对象,也就是实现了构建算法和装配算法的解耦,实现了更好的复用。
UML类图
角色介绍
名字 | 说明 |
---|---|
Builder | 定义了产品的接口 |
Director | 定义实际构造产品的类 |
TextBuilder | Builder接口的实现类(此处的产品指的是纯文本类) |
HTMLBuilder | Builder接口的实现类(此处的产品指的是HTML文本类) |
Client | 测试程序行为的类 |
Builder模式简单实现
Builer接口
public interface Builder {
public abstract void makeTitle(String title);
public abstract void makeString(String str);
public abstract void makeItems(String[] items);
public abstract void close();
}
Director构造类
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder=builder;
}
/*
* 具体进行文档创建的方法,包含创建文档的若干步骤
*/
public void construct(){
builder.makeTitle("标题");
builder.makeString("我是正文");
builder.makeItems(new String[]{
"晚上好","早上好"
});
builder.close();
}
}
TextBuilderiy纯文本实现类
public class TextBulider implements Builder{
private StringBuffer buffer=new StringBuffer();
@Override
public void makeTitle(String title) {
buffer.append("*===========================*");
buffer.append("["+title+"]");
buffer.append("\n");
}
@Override
public void makeString(String str) {
buffer.append("-->:"+str+"\n");
buffer.append("\n");
}
@Override
public void makeItems(String[] items) {
for(int i=0;i<items.length;i++){
buffer.append(" ."+items[i]+"\n");
}
buffer.append("\n");
}
@Override
public void close() {
buffer.append("============================\n");
}
public String getResult(){
return buffer.toString();
}
}
HTMLBuilder网页文本实现类
public class HTMLBuilder implements Builder{
private StringBuffer buffer=new StringBuffer();
@Override
public void makeTitle(String title) {
buffer.append("<html><head><title>"+title+"</title>");
}
@Override
public void makeString(String str) {
buffer.append("<p>"+str+"</p>");
}
@Override
public void makeItems(String[] items) {
buffer.append("<ul>");
for(int i=0;i<items.length;i++){
buffer.append("<li>"+items[i]+"</li>");
}
buffer.append("</ul>");
}
@Override
public void close() {
buffer.append("</body></html>");
}
public String getResult(){
return buffer.toString();
}
}
Client测试类
public class Client {
public static void main(String[] args) {
// TextBulider builder=new TextBulider();
// Director director=new Director(builder);
// director.construct();
// String result=builder.getResult();
// System.out.println(result);
HTMLBuilder builder =new HTMLBuilder();
Director director=new Director(builder);
director.construct();
String result=builder.getResult();
System.out.println(result);
}
}
23种设计模式之Builder设计模式的更多相关文章
- 23种设计模式 - 对象创建(FactoryMethod - AbstractFactory - Prototype - Builder)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象创建 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java开发中的23种设计模式(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- c#中的23种设计模式
C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...
- Java 23种设计模式
转自: http://zz563143188.iteye.com/blog/1847029 ; i<count; i++){ list.add(new MailSender()); } } pu ...
- 从追MM谈Java的23种设计模式(转)
从追MM谈Java的23种设计模式 这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...
- java 23种设计模式及具体例子 收藏有时间慢慢看
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...
- JAVA:23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- Visual Studio中相对路径中的宏定义
$(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的值.有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置. $(References) 以分号分隔的引用列表被添加到 ...
- nfs 所有的版本的 RFC 整理; nfs 所有版本对比;
下面是针对 nfs 所有的版本,我们可以通过不同的RFC 进行详细看其RFC的细节来进行对比: 下面是备忘一些NFS RFC 的链接: https://datatracker.ietf.org/doc ...
- VMware Workstation 15 Pro中安装ubuntu1804
这篇笔记是一篇安装教程,没有什么实际的意义,仅为了记录一下……距离上次弄这东西不知道多长时间了,以至于这次再次使用时很是生疏,于是就想着把过程记录下来方便之后查看. 这里不涉及VMware Works ...
- System.out.println高并发下导致应用暂停
今天在进行序列号压测的时候,通过调用genSeqId方法来获取序列号,100并发,16台压测机器,发现无论怎么压测,调用量达到140w左右的时候,此方法的ops直接掉到了0,具体图示如下: 从上图可以 ...
- AWVS12破解版使用
本篇简单介绍AWVS12破解版的安装使用,如果您已经安装了AWVS 10.5的版本,不用卸载,可以共存. AWVS12破解版下载链接:https://github.com/starnightcyber ...
- C# 多线程总结 异常处理 线程取消 锁(lock)
那么什么时候能用多线程? 任务能并发的时候 多线程能干嘛?提升速度/优化用户体验 网站首页:A数据库 B接口 C分布式服务 D搜索引擎,适合多线程并发,都完成后才能返回给用户,需要等待WaitAll列 ...
- IT兄弟连 HTML5教程 CSS3属性特效 圆角
传统的圆角生成方案,必须使用多张图片作为背景图案.CSS3的出现,使得我们再也不必浪费时间去制作这些图片了,只需要border-radius属性,支持浏览器IE 9.Opera 10.5.Safari ...
- CSS雪碧图(精灵图)使用
1:CSS雪碧图:CSS雪碧图 即 CSS Sprites,也有人叫它CSS精灵图. 2:雪碧图的由来:一个网站的页面需要大量的小图片或者小图标,但是大量的图片如果放在服务器上,每次当打开网站并且向服 ...
- 团队项目之Scrum6
小组:BLACK PANDA 时间:2019.11.26 每天举行站立式会议 提供当天站立式会议照片一张 2 昨天已完成的工作 2 编辑功能优化 实现主页内容展示 今天计划完成的工作 2 内容展示 根 ...
- Pinpoint-agent监控springboot编译的jar启动方式
由于springboot在打包发版时已经将tomcat容器内嵌到jar文件中,可以通过以下命令来使pinpoint-agent监控生成的jar服务 java -javaagent:D:\Softwar ...