本文地址: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();
}
@Override
public void buildHead() {
person.setHead("建造男人的头"); }
@Override
public void buildBody() {
person.setBody("建造男人的身体"); }
@Override
public void buildFoot() {
person.setFoot("建造男人的脚"); }
@Override
public 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设计模式之建造者模式 建造者模式 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. JQuery 分割字符串

    JQuery 分割字符串 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  2. 《互联网MySQL开发规范》

    一.基础规范 使用 INNODB 存储引擎 表字符集使用 UTF8  所有表都需要添加注释 单表数据量建议控制在 5000W 以内 不在数据库中存储图⽚.文件等大数据 禁止在线上做数据库压力测试 禁⽌ ...

  3. SQL Server中Rowcount与@@Rowcount

    rowcount的用法 rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例, set rowcount 10 select * from 表A 这样的查询只会 ...

  4. 【C#】Lamada表达式演变过程

    static void Main() { //第一步 委托实例调用 Func<string, int> test = new Func<string, int>(getLeng ...

  5. PHP 5.4.0之Traits

    [PHP之Traits] As of PHP 5.4.0, PHP implements a method of code reuse called Traits. 1.Traits基础 2.优先级: ...

  6. python笔记11-多线程之Condition(条件变量)

    前言 当小伙伴a在往火锅里面添加鱼丸,这个就是生产者行为:另外一个小伙伴b在吃掉鱼丸就是消费者行为.当火锅里面鱼丸达到一定数量加满后b才能吃,这就是一种条件判断了. 这就是本篇要讲的Condition ...

  7. 「TJOI 2018」教科书般的亵渎

    「TJOI 2018」教科书般的亵渎 题目描述 小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为 \(a_i\) ,且每个怪物血量均不相同, 小豆手里有无限张"亵渎" ...

  8. loj117 有源汇有上下界最小流

    link 题意&题解 code: #include<bits/stdc++.h> #define rep(i,x,y) for (int i=(x);i<=(y);i++) ...

  9. poj 1733 并查集+hashmap

    题意:题目:有一个长度 已知的01串,给出多个条件,[l,r]这个区间中1的个数是奇数还是偶数,问前几个是正确的,没有矛盾 链接:点我 解题思路:hash离散化+并查集 首先我们不考虑离散化:s[x] ...

  10. 69.广搜练习:  最少转弯问题(TURN)

    [问题描述] 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯 ...