本文地址: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

  1. import javax.swing.*;
  2. public class PanelProduct extends JPanel{
  3. JButton button;
  4. JLabel label;
  5. JTextField textField;
  6. }

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

  1. import.javax.swing.*;
  2. public interface Builder{
  3. public abstract void buildButton();
  4. public abstract void buildLabel();
  5. public abstract void buildTextField();
  6. public abstract JPanel getPanel();
  7. }

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

  1. import javax.swing.*;
  2. public class ConcreteBuilderOne implements Builder{
  3. private PanelProduct panel;
  4. ConcreteBuilderOne(){
  5. panel=new PanelProduct();
  6. }
  7. public void buildButton(){
  8. panel.button=new JButton("按钮");
  9. }
  10. public void buildLabel(){
  11. panel.label=new JLabel("标签");
  12. }
  13. public void buildTextField(){
  14.  
  15. }
  16. public JPanel getPanel(){
  17. panel.add(panel.button);
  18. panel.add(panel.label);
  19. return panel;
  20. }
  21. }

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

  1. import javax.swing.*;
  2. public class ConcreteBuilderTwo implements Builder{
  3. private PanelProduct panel;
  4. ConcreteBuilderTwo(){
  5. panel=new PanelProduct();
  6. }
  7. public void buildButton(){
  8. panel.button=new JButton("button");
  9. }
  10. public void buildLabel(){
  11.  
  12. }
  13. public void buildTextField(){
  14. panel.textField=new JTextField("textField");
  15. }
  16. public JPanel getPanel(){
  17. panel.add(panel.textField);
  18. panel.add(panel.button);
  19. return panel;
  20. }
  21. }

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

  1. import javax.swing.*;
  2. public class Director{
  3. private Builder builder;
  4. Director(Builder builder){
  5. this.builder=builder;
  6. }
  7. public JPanel constructProduct(){
  8. builder.buildButton();
  9. builder.buildLabel();
  10. builder.buildTextField();
  11. JPanel product=builder.getPanel();
  12. return product;
  13. }
  14. }

5.应用 Application.java

  1. import javax.swing.*;
  2. public class Application{
  3. public static void main(String args[]){
  4. Builder builder=new ConcreteBuilderOne();
  5. Director director=new Director(builder);
  6. JPanel panel=director.constructProduct();
  7. JFrame frameOne=new JFrame();
  8. frameOne.add(panel);
  9. frameOne.setBounds(12,12,200,120);
  10. frameOne.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  11. frameOne.setVisible(true);
  12. builder=new ConcreteBuilderTwo();
  13. director=new Director(builder);
  14. panel=director.constructProduct();
  15. JFrame frameTwo=new JFrame();
  16. frameTwo.add(panel);
  17. frameTwo.setBounds(212,12,200,120);
  18. frameTwo.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  19. frameTwo.setVisible(true);
  20. }
  21. }

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

类图如下所示:

Builder

  1. public interface PersonBuilder {
  2. void buildHead();
  3. void buildBody();
  4. void buildFoot();
  5. Person buildPerson();
  6. }

ConcreteBuilder

  1. public class ManBuilder implements PersonBuilder {
  2. Person person;
  3. public ManBuilder() {
  4. person = new Man();
  5. }
  6. @Override
  7. public void buildHead() {
  8. person.setHead("建造男人的头");
  9.  
  10. }
  11. @Override
  12. public void buildBody() {
  13. person.setBody("建造男人的身体");
  14.  
  15. }
  16. @Override
  17. public void buildFoot() {
  18. person.setFoot("建造男人的脚");
  19.  
  20. }
  21. @Override
  22. public Person buildPerson() {
  23. return person;
  24. }
  25. }

Director

  1. public class PersonDirector {
  2. public Person constructPerson(PersonBuilder pb) {
  3. pb.buildHead();
  4. pb.buildBody();
  5. pb.buildFoot();
  6. return pb.buildPerson();
  7. }
  8. }

Product

  1. public class Person {
  2. private String head;
  3. private String body;
  4. private String foot;
  5. public String getHead() {
  6. return head;
  7. }
  8. public void setHead(String head) {
  9. this.head = head;
  10. }
  11. public String getBody() {
  12. return body;
  13. }
  14. public void setBody(String body) {
  15. this.body = body;
  16. }
  17. public String getFoot() {
  18. return foot;
  19. }
  20. public void setFoot(String foot) {
  21. this.foot = foot;
  22. }
  23. }
  24. public class Man extends Person {
  25.  
  26. }

Test

  1. public class Test {
  2. public static void main(String[] args) {
  3. PersonDirector pd = new PersonDirector();
  4. Person person = pd.constructPerson(new ManBuilder());
  5. System.out.println(person.getBody());
  6. System.out.println(person.getFoot());
  7. System.out.println(person.getHead());
  8. }
  9. }

生成器模式的优点

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

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

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

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

您还可能感兴趣:

java设计模式系列:

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

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

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

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

java设计模式4--建造者模式(Builder)的更多相关文章

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

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

  2. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  3. java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  4. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  5. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  6. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  7. JAVA设计模式总结—建造者模式

    建造者模式 模式动机与定义 ​ 首先建造者模式的动机是为了创建复杂对象,简化传统的创建方法,提高创建的效率和可读性. ​ 像图中的这个例子,用户的需求是驾驶一辆汽车,但是对于用户来说是不需要了解汽车装 ...

  8. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  9. java设计模式之四建造者模式(Builder)

    工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...

  10. 【java】java 设计模式(4):建造者模式(Builder)

    工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...

随机推荐

  1. 洛谷P3444 [POI2006]ORK-Ploughing [枚举,贪心]

    题目传送门 ork 格式难调,题面就不放了. 分析: 一道偏难的贪心和枚举题.考试的时候是弃疗了...yyb巨佬已经讲的很详细了,推荐他的博客.这里小蒟蒻就只放代码了. Code: #include& ...

  2. Python并发编程-信号量

    信号量保证同一资源同一时间只能有限定的进程去访问 一套资源,同一时间,只能被n个人访问 某一段代码,同一时间,只能被n个进程执行 from multiprocessing import Process ...

  3. Nginx配置站点https

    step 1: 检查nginx的编译参数 使用nginx -V可以查看,如果编译参数中包含http_ssl_module,可以继续下一步操作,如果没有,则需要从新编译. step 2: 申请证书 目前 ...

  4. 如何制作RTS游戏的寻路系统?

    Q1:我们在做一个RTS游戏,开始用的是Unity自带的NavMesh的寻路,但发现这个并不适合RTS多人寻路,因为总会出现阻挡和闪跳的问题.看Asset Store上的A* path插件评论说在碰撞 ...

  5. PlayMaker GUI的Normalized

    PlayMaker GUI的Normalized   在PlayMaker的GUI设置中,开发者可以通过Left.Top设置控件元素的起始点位置,通过Width.Height设置控件的大小.考虑到用户 ...

  6. 2017/11/7 Leetcode 日记

    2017/11/7 Leetcode 日记 669. Trim a Binary Search Tree Given a binary search tree and the lowest and h ...

  7. POJ 3904 JZYZOJ 1202 Sky Code 莫比乌斯反演 组合数

    http://poj.org/problem?id=3904   题意:给一些数,求在这些数中找出四个数互质的方案数.   莫比乌斯反演的式子有两种形式http://blog.csdn.net/out ...

  8. 【SPFA+二分答案】BZOJ1614- [Usaco2007 Jan]Telephone Lines架设电话线

    沉迷于刷水 以前的那个二分写法过不了QAQ 换了一种好像大家都比较常用的二分.原因还不是很清楚. [题目大意] 给出一张图,可以将其中k条边的边权减为0,求1到n的路径中最长边的最小值. [思路] 二 ...

  9. 【裸裸的左偏树】BZOJ1455-罗马游戏

    [题目大意] 给出一些数和一些操作.M:合并两个数所在的集合,如果有任意一个数被删除则忽略操作:K:删除某个数所在集合中最小的数. [思路] 裸裸的,复习^ ^ #include<iostrea ...

  10. unix-软件安装

    检查软件是否已经安装 rpm -qa|grep 软件标识名 在线安装软件 yum -y install 软件标识名