生成器模式

1、描述

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

2、使用场景

当系统准备为用户提供一个内部结构复杂的对象,而且在构造方法中编写创建该对象的代码无法满足用户需求时,就可以使用生成器模式来构造这样的对象。

当某些系统要求对象的构造过程必须独立于创建该对象的类时。

eg:我们要写一个包含有按钮、标签和文本框的组件容器。不同用户对容器有着不同的要求。比如有些用户希望容器中只含有按钮和标签,有些用户希望容器中含有的标签、按钮和文本框。另外,用户对组件在容器中的顺序位置也有不同的要求,比如某些用户要求组件在容器中排列是按钮、标签、文本框,有的用户希望排列顺序是标签、文本框、按钮。显然我们不能在容器的构造方法中编写组件的创建代码,也不能编写排列这些组件位置的代码。

3、模式中的角色

产品(Product):具体生成器要构造的复杂对象。

抽象生成器(Builder):抽象生成器是一个接口,该接口除了创建一个Product对象的各个组件定义了若干个方法外,还要定义返回Product对象的方法。

具体生成器(ConcreteBuilder):实现Builder接口的类,具体生成器将实现Builder接口所定义的方法。

指挥者(Director):指挥者是一个类,该类需含有Builder接口声明的变量。指挥者的职责是负责向用户提供具体的生成器,即指挥者将请求具体生成器来构造用户所需要的Product对象,如果所请求的具体生成器成功的构造出Product对象,指挥者就可以让该具体生成器返回所构造的Product对象。(可以不需要)

4、类的关系图

5、代码实现
package org.sunday.builder;
/**
* 产品
* @author sunday
*
*/
public class PanelProduct {
private Label lable;
private TextField textField;
private Button button;
public Label getLable() {
return lable;
}
public void setLable(Label lable) {
this.lable = lable;
}
public TextField getTextField() {
return textField;
}
public void setTextField(TextField textField) {
this.textField = textField;
}
public Button getButton() {
return button;
}
public void setButton(Button button) {
this.button = button;
}
@Override
public String toString() {
return lable.getColor()+"标签 "+textField.getColor()+"输入框 " + button.getColor() + "按钮";
}
}
package org.sunday.builder;
/**
* 抽象生成器
* @author sunday
*
*/
public interface Builder {
public abstract void builderLabel();
public abstract void builderTextField();
public abstract void builderButton();
public abstract PanelProduct getPanel();
}
package org.sunday.builder;
/**
* 具体生成器
* @author sunday
*
*/
public class BuilderOne implements Builder {
private PanelProduct pp;
public BuilderOne(PanelProduct pp) {
this.pp = pp;
}
@Override
public void builderLabel() {
pp.setLable(new Label("黑色"));
}
@Override
public void builderTextField() {
pp.setTextField(new TextField("黑色"));
}
@Override
public void builderButton() {
pp.setButton(new Button("黑色"));
}
@Override
public PanelProduct getPanel() {
builderLabel();
builderButton();
builderTextField();
return pp;
}
}
package org.sunday.builder;
/**
* 具体生成器
* @author sunday
*
*/
public class BuilderTwo implements Builder {
private PanelProduct pp;
public BuilderTwo(PanelProduct pp) {
this.pp = pp;
}
@Override
public void builderLabel() {
pp.setLable(new Label("黄色"));
}
@Override
public void builderTextField() {
pp.setTextField(new TextField("蓝色"));
}
@Override
public void builderButton() {
pp.setButton(new Button("白色"));
}
@Override
public PanelProduct getPanel() {
builderLabel();
builderButton();
builderTextField();
return pp;
}
}
package org.sunday.builder;
public class Test {
public static void main(String[] args) {
Builder one = new BuilderOne(new PanelProduct());
System.out.println(one.getPanel().toString());
Builder two = new BuilderTwo(new PanelProduct());
System.out.println(two.getPanel().toString());
}
}

运行结果:

设计模式(三)之生成器模式(Builder Pattern)相关推荐

  1. C#设计模式——生成器模式(Builder Pattern)

    一.概述 在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封 ...

  2. 二十三种设计模式[3] - 生成器模式(Builder Pattern)

    前言 生成器,又名建造者模式,属于创建型模式.在<设计模式 - 可复用的面向对象软件>一书中对它的描述为" 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表 ...

  3. Net设计模式实例之建造者模式(Builder Pattern)(2)

    四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...

  4. 设计模式笔记——生成器模式(Builder Pattern)

    一.概述 在软件系统中,把构造对象实例的逻辑移到了类的外部,在这个类的外部定义了类的逻辑.它把一个复杂对象的构造过程从对象的表示中分离出来了,其直接效果是将一个复杂的对象简化为一个比较简单的目标对象. ...

  5. 《研磨设计模式》chap8 生成器模式Builder

    场景:现有一"导出数据"的需求,分别导出到文本和xml. 1. 正常编码 /*** 导出数据到文本文件的对象*/ public class ExportToTxt {/*** 导出 ...

  6. .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  7. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  8. 【设计模式自习室】门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  9. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

  10. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

最新文章

  1. 实现一个不能被继承的类
  2. 后端系统开发之白名单机制
  3. android 按键消息,Android监听Home按键消息
  4. 关于计算机网络拓扑说法正确,计算机网络试题库 - 谢希仁(第六版)(答案解析)...
  5. .container的应用
  6. hive3新增資料_Hive表新增字段后,新字段无法写入值问题总结
  7. java语言编程三角形图形_编程题:编写程序输入三角形的3条边长,计算并输出... 求助一道JAVA编程题:编写一个类似记事本的图形用......
  8. 大物实验-直接测量量不确定度计算器 开发备忘录
  9. Thingsboard 本地编译 com.google.protobuf:protoc:exe:osx-x86_64:3.11.4 无法下载
  10. CUDA10,Torch安装解决NOTFOUND CUDA_cublas_device_LIBRARY,Ubuntu16.04安装torch遇到的错误
  11. 【AIOT】HumanCenteredSensing
  12. 泰坦尼克号各种因素对存活率的影响
  13. CVPR ECCV ICCV 计算机视觉顶会论文下载
  14. 一个完整和详细的网站SEO优化解决方案
  15. R语言中的异常处理和eval函数
  16. java英雄国度加速版_谷得游戏 - 评价 | TapTap 发现好游戏
  17. 【6Dof位姿估计】DPVL:6DoF Object Pose Estimation via Differentiable Proxy Voting Loss论文理解
  18. 基于易灵思开发板RiscV的调试流程
  19. UG NX 12 基准平面
  20. C++ 指针与取地址

热门文章

  1. 系统建模与仿真 - 电子书下载(高清版PDF格式+EPUB格式)
  2. AutoForm Master v4.04-ISO 1CD(专业板金优化分析软件,好用!)/
  3. 2022 HTML + CSS面试题,美女吐血整理
  4. excel熵值法计算权重_手把手教你用熵值法计算权重
  5. python实现【国家统计局】三级区划代码和城乡划分代码爬取
  6. AIML应答机器人(二)java实现
  7. 【第168期】游戏策划:草率了,这简历像极了脱缰的马儿
  8. 第十三届“恩智浦”杯全国大学生智能汽车竞赛-信标对抗组比赛总结
  9. vcpkg安装和使用--学习入门
  10. MAC m1芯片 Ubuntn配置过程