本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址。

建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

概述

当系统准备为用户提供一个内部结构复杂的对象时,就可以使用生成器模式,使用该模式可以逐步地构造对象,使得对象的创建更具弹性。生成器模式的关键是将一个包含有多个组件对象的创建分成若干个步骤,并将这些步骤封装在一个称作生成器的接口中。

适用性

1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2.当构造过程必须允许被构造的对象有不同的表示时。

参与者

1.Builder 为创建一个Product对象的各个部件指定抽象接口。

2.ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部件。 定义并明确它所创建的表示。 提供一个检索产品的接口。

3.Director 构造一个使用Builder接口的对象。

4.Product 表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

建造者模式的结构与使用

模式的结构中包括四种角色:

•产品(Product)

•抽象生成器(Builder)

•具体生成器(ConcreteBuilder)

•指挥者(Director)

模式的UML类图

实战部分

【例1】:创建含有按钮、标签和文本框组件的容器。不同用户对容器有不同的要求,比如某些用户希望容器中只含有按钮和标签,某些用户希望容器只含有按钮和文本框等。另外用户对组件在容器中的顺序位置也有不同的要求,比如某些用户要求组件在容器中从左至右的排列顺序是按钮、标签、文本框,而某些用户要求从左至右的排序时标签、文本框、按钮。

模式的结构的描述与使用

1.产品(Product): PanelProduct.java

import javax.swing.*;
public class PanelProduct extends JPanel{JButton button; JLabel label;                JTextField textField;
}

2.抽象生成器(Builder): Builer.java

import.javax.swing.*;
public interface Builder{public abstract void buildButton();public abstract void buildLabel();public abstract void buildTextField();public abstract JPanel getPanel();
}

3.具体生成器(ConcreteBuilder)_1 : ConcreteBuilderOne.java

import javax.swing.*;
public class ConcreteBuilderOne implements Builder{private PanelProduct panel;      ConcreteBuilderOne(){panel=new PanelProduct();} public void buildButton(){panel.button=new JButton("按钮");}public void buildLabel(){panel.label=new JLabel("标签");}public void buildTextField(){}public JPanel  getPanel(){panel.add(panel.button); panel.add(panel.label);return panel;}
}

3.具体生成器(ConcreteBuilder)_2 : ConcreteBuilderTwo.java

import javax.swing.*;
public class ConcreteBuilderTwo implements Builder{private PanelProduct panel;       ConcreteBuilderTwo(){panel=new PanelProduct();} public void buildButton(){panel.button=new JButton("button");}public void buildLabel(){}public void buildTextField(){panel.textField=new JTextField("textField");}public JPanel  getPanel(){panel.add(panel.textField);panel.add(panel.button);return panel;}
} 

4.指挥者(Director): Director.java

import javax.swing.*;
public class Director{private Builder builder;Director(Builder builder){this.builder=builder;}public JPanel constructProduct(){builder.buildButton();builder.buildLabel();builder.buildTextField();JPanel product=builder.getPanel();return product;}
} 

5.应用 Application.java

import javax.swing.*;
public class Application{public static void main(String args[]){Builder builder=new ConcreteBuilderOne();Director director=new Director(builder);JPanel panel=director.constructProduct();JFrame frameOne=new JFrame();frameOne.add(panel);frameOne.setBounds(12,12,200,120);frameOne.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frameOne.setVisible(true);builder=new ConcreteBuilderTwo();director=new Director(builder);panel=director.constructProduct();JFrame frameTwo=new JFrame();frameTwo.add(panel);frameTwo.setBounds(212,12,200,120);frameTwo.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frameTwo.setVisible(true);}
}

【例2】:构建一个男人的类,使得构建和表示分离

类图如下所示:

Builder

public interface PersonBuilder {void buildHead();void buildBody();void buildFoot();Person buildPerson();
}

ConcreteBuilder

public class ManBuilder implements PersonBuilder {Person person;public ManBuilder() {person = new Man();}@Overridepublic void buildHead() {person.setHead("建造男人的头");}@Overridepublic void buildBody() {person.setBody("建造男人的身体");}@Overridepublic void buildFoot() {person.setFoot("建造男人的脚");}@Overridepublic Person buildPerson() {return person;}
}

Director

public class PersonDirector {public Person constructPerson(PersonBuilder pb) {pb.buildHead();pb.buildBody();pb.buildFoot();return pb.buildPerson();}
}

Product

public class Person {private String head;private String body;private String foot;public String getHead() {return head;}public void setHead(String head) {this.head = head;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}public String getFoot() {return foot;}public void setFoot(String foot) {this.foot = foot;}
}
public class Man extends Person {}

Test

public class Test {public static void main(String[] args) {PersonDirector pd = new PersonDirector();Person person = pd.constructPerson(new ManBuilder());System.out.println(person.getBody());System.out.println(person.getFoot());System.out.println(person.getHead());}
}

生成器模式的优点

•生成器模式将对象的构造过程封装在具体生成器中,用户使用不同的具体生成器就可以得到该对象的不同表示。

•可以更加精细有效地控制对象的构造过程。生成器将对象的构造过程分解成若干步骤,这就使得程序可以更加精细,有效地控制整个对象的构造。

•生成器模式将对象的构造过程与创建该对象类解耦,使得对象的创建更加灵活有弹性。

•当增加新的具体生成器时,不必修改指挥者的代码,即该模式满足开-闭原则。

您还可能感兴趣:

java设计模式系列:

java设计模式3--单例模式(Singleton)

java设计模式2--抽象工厂模式(Abstract Factory)

java设计模式1--工厂方法模式(Factory Method)

java设计模式0--设计模式简介

java设计模式4--建造者模式(Builder)相关推荐

  1. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  2. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  3. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

  4. java设计模式之建造者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  5. JAVA设计模式之建造者模式

    转自 JAVA设计模式之建造者模式 建造者模式(Builder)的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂对象的创建型 ...

  6. 一文弄懂Java设计模式之建造者模式:图解+游戏角色生成实例

    文章目录 详解Java设计模式之建造者模式 案例引入建造者模式 建造者模式 定义 UML类图表示 模式结构 案例分析与代码实现 案例类图实现 代码结构 代码实现 结果分析 指挥者类的深入讨论 钩子方法 ...

  7. Java设计模式之建造者模式(精髓版)

    目录 1.建造者模式阐述 2.使用Java代码实现建造者模式 3.为什么需要使用建造者模式? 4.建造者模式与工厂方法模式有什么区别? 1.建造者模式阐述 Java 建造者模式是一种创建型设计模式,其 ...

  8. Android设计模式之建造者模式builder

    今天小编来说一下Android中的一种设计模式--建造者模式Builder 绪论: 那么对于Android初级来说,Builder设计模式可能在我们开发中用过的很少,但是我们可能见过,我们经常用的Al ...

  9. 设计模式之—建造者模式(Builder)-Java实现

    Builder模式,将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部 表象的产品对象.建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节.建造模式可以 ...

  10. Java设计模式之建造者(Builder)模式详细总结

    一.概述: 将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示. 二.结构: 1.Product(复杂的产品对象):一个复杂对象,包含多个成员变量. public class P ...

最新文章

  1. 小程序工程化实践(上篇)-- 手把手教你撸一个小程序 webpack 插件,一个例子带你熟悉 webpack 工作流程...
  2. android控件---自定义带文本的ImageButton
  3. python居中填充_Python代码中 如何将字符串填充为指定长度并保持原字符串居中呢?...
  4. 广东省那么发达,为什么还有全国贫困县?
  5. CSS Sprite的应用【转】
  6. 串口发送字符串到串口软件
  7. c语言统计字符个数回车字符,C语言统计一串字符中空格键、Tab键、回车键、字母、数字及其他字符的个数(Ctrl+Z终止输入)...
  8. spring-cloud-sleuth 和 分布式链路跟踪系统
  9. win10桌面null图标删除
  10. GaussDB Hash表分布列选择原则及数据倾斜检测
  11. CI框架SESSION使用
  12. matlab 散点图 对数,matlab – 对数 – 对数散点图上的半透明标记
  13. css中flex设置为1是什么意思
  14. ES6及以上语法(主代码)
  15. 机器学习的前世今生:一段波澜壮阔的历史
  16. 收集的一些学习ios的好网站
  17. Android 监控APP是否在后台运行
  18. 你的收藏夹里,有哪些神奇有趣的小网站?
  19. 计算机读不了硬盘分区,电脑开机后读不到硬盘怎么办
  20. 供应商寄售过程的实现

热门文章

  1. Deep Learning Face Representation by Joint Identification-Verification
  2. Spring Cloud Alibaba - 20 Nacos StandAlone模式下的数据存储(Derby)及新增登录用户
  3. MySQL-Btree索引和Hash索引初探
  4. 白话Elasticsearch72_利用HDFS备份与恢复ES生产集群的数据
  5. Linux中yum和apt-get
  6. Shell printf 命令
  7. 高精度加法(C++实现)
  8. Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules
  9. java代码上传到私服,java生成 java代码 上传maven私服
  10. 2021-03-15 数据挖掘算法—K-Means算法 Python版本