java设计模式4--建造者模式(Builder)
本文地址: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设计模式2--抽象工厂模式(Abstract Factory)
java设计模式4--建造者模式(Builder)的更多相关文章
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
- java设计模式3——建造者模式
java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- JAVA设计模式总结—建造者模式
建造者模式 模式动机与定义 首先建造者模式的动机是为了创建复杂对象,简化传统的创建方法,提高创建的效率和可读性. 像图中的这个例子,用户的需求是驾驶一辆汽车,但是对于用户来说是不需要了解汽车装 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- java设计模式之四建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...
- 【java】java 设计模式(4):建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...
随机推荐
- java总结(一)(变量类型)
java代码运行原理 需要注意 公共类类名必须和文件名相同 一个文件可以有好几个类,编译生成n个类文件名 chcp 65001----utf8 936----GBK 437----美国英语 文档注释必 ...
- Vsftpd支持SSL加密传输
ftp传输数据是明文,弄个抓包软件就可以通过数据包来分析到账号和密码,为了搭建一个安全性比较高ftp,可以结合SSL来解决问题 SSL(Secure Socket Layer)工作于传输层和应用程 ...
- Python并发编程-守护进程
守护进程 子进程转换为守护进程 主进程的代码结束,子进程的代码也应该接收, 这个事情有守护进程来做 守护进程会随着主进程的代码执行完毕而结束, 而不是随着主进程的接收而结束(子进程不一定结束) fro ...
- golang中接口interface和struct结构类的分析
再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和 ...
- svn代码同步脚本
碰到一个需求,主要是2个项目需要用到同一份代码,主要是域名和配置信息不一样,而且要把svn更新的代码同步过去.本来考虑提交时用钩子同步过去,但考虑到同步过去的代码还需要测试,而且另一边代码的时效性不强 ...
- springMVC+freemarker实现自定义标签
在开发过程中,有些需要引用到重复的页面,或者动态的数据 修改数据库是可以实现,但是太麻烦了. freemarker自定义标签在开发中用途很广,就说个入门实例吧 基于springmvc. 首先需要导入对 ...
- Eclipse酷炫项目、最新趋势介绍
作为Eclipse基金组织的执行董事,我需要经常审阅每一个新提交的Eclipse项目协议书.作为Eclipse的一分子,我很乐意与加入我们团队的新开发人员互动.这也是我工作中的乐趣之一.2013年,我 ...
- MySQL笔记(五)之表的连接
MySql数据库中表的连接一共有如下几种 INNER JOIN 内连接 语法: SELECT column_name(s) FROM table_name1 INNER JOIN table_name ...
- 洛谷P1149 火柴棒等式
题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 1.加号与等号 ...
- java23种设计模式之一: 代理模式(动态代理)
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...