生成器模式是一种创建型设计模式,它把对象的创建步骤抽象成生成器,并且可以通过指导类(director)对所有生成步骤的先后顺序进行控制。客户端使用指导类并传入相应的生成器,通过指导类的接口便可以得到相应的对象。

以我的理解看,生成器模式中的生成器被用来对生成对象的每一个步骤自身进行控制,比如要产生一辆汽车(最终对象),那么玻璃是用普通玻璃还是防弹玻璃(生成最终对象的一个步骤)。而指导类主要用来设置各个步骤之间的次序与取舍,比如先安装门还是先安装玻璃,要不要安装座垫加热。

生成器模式与抽象工厂模式看起来很像,其实有很多不同。首先抽象工厂模式更注重于“系列”,即要创建的产品族分为不同的系列,同一系列中的产品是固定的,创建的步骤也是固定的。而生成器模式的重点在于对创建过程中每一个步骤的精细控制以及步骤间次序的控制,这些在抽象工厂模式中是不方便进行控制的(甚至需要修改或创建新的工厂抽象类)。

下面以一辆汽车的生产为例。

首先是汽车类:

interface CarPlan {void setWheel(String wheel);void setFrame(String frame);void setEngine(String engine);void setWidget(String widget);
}class Car implements CarPlan {private String myWheel;private String myFrame;private String myEngine;private String myWidget;void setWheel(String wheel) {myWheel = wheel;}void setFrame(String frame) {myFrame = frame;}void setEngine(String engine) {myEngine = engine;}void setWidget(String widget) {myWidget = widgetl}
}

然后创建生成器:

interface Builder {void buildWheel();void buildFrame();void buildEngine();void buildWidget();Car getCar();
}
//一个廉价车生成器
class CheapBuilder implements Builder {Car cheapCar = new Car();Car getCar() {return cheapCar;}void buildWheel() {cheapCar.setWheel("cheap wheel");}void buildFrame() {cheapCar.setFrame("cheap frame");}void buildEngine() {cheapCar.setEngine("cheap engine");}void buildWidget() {cheapCar.setWidget("no widget");}
}
//一个平价车生成器
class EconomicBuilder implements Builder {Car economicCar = new Car();Car getCar() {return economicCar;}void buildWheel() {cheapCar.setWheel("cheap wheel");}void buildFrame() {cheapCar.setFrame("expensive frame");}void buildEngine() {cheapCar.setEngine("cheap engine");}void buildWidget() {cheapCar.setWidget("economic widget");}
}

创建指导类:

class Director {private Builder builder;director(Builder bld) {builder = bld;}void produceCar() {//这里对步骤进行控制builder.buildFrame();builder.buildWidget();builder.buildWheel();builder.buildEngine();}Car getCar() {builder.getCar();}
}

客户端使用:

public class Test {public static void main(String[] args) {Builder bld = new EconomicBuilder();Director director = new Director(bld);director.produceCar();Car car = director.getCar();
}

设计模式—生成器模式(建造者模式)相关推荐

  1. 设计模式-创建型模式-建造者模式

    设计模式-创建型模式-建造者模式 建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 代码如下 // 产品类 public class Product{pu ...

  2. 设计模式---5(建造者模式的概念及其实现,建造者模式的角色与职责,建造者模式和工厂模式的区别)

    建造者模式 建造者模式的概念 Builder 模式也叫建造者模式或者生成器模式,是由 GoF 提出的 23 种设计模式中的一种. Builder 模式是一种对象创建型模式之一,用来隐藏复合对象的创建过 ...

  3. 设计模式系列之建造者模式构建实体类

    设计模式系列之建造者模式(Build Pattern)构建实体类 模式定义 建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法. 所谓建造者模式就是**将组件和组件的组件过 ...

  4. 《设计模式详解》创建型模式 - 建造者模式

    建造者模式 4.4 建造者模式 4.4.1 概述 4.4.2 结构 4.4.3 实例 4.4.4 优缺点 4.4.5 使用场景 4.4.6 扩展 - 构建对象 重构前 重构后 4.5 创建型模式对比 ...

  5. 设计模式之路 | 建造者模式

    模式的定义与特点 建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式.它是将一个复杂的对象分解为多个简单的对象 ...

  6. 重学Java设计模式-创建者模式-建造者模式

    重学Java设计模式-创建者模式-建造者模式 内容摘自:重学 Java 设计模式:实战建造者模式「各项装修物料组合套餐选配场景」 | bugstack 虫洞栈 建造者模式介绍 图片来自:https:/ ...

  7. Java 设计模式情景分析——建造者模式

    当我们遇到类似汽车的装配,需要车轮.方向盘.发动机,还有各种小零件时,为了在构建过程中隐藏实现细节,就可以使用建造者模式 (Builder模式) 将部件和组装过程分离,使得构建过程和部件都可以自由扩展 ...

  8. 【设计模式】(八)--创建型模式--建造者模式

    [设计模式](八)–创建型模式–建造者模式 建造者模式 [设计模式](八)--创建型模式--建造者模式 建造者模式定义 构造者模式的优点 构造者模式的使用场景 构造者模式和工厂模式区别 构造者模式简单 ...

  9. 设计模式 — 创建型模式 — 建造者模式

    目录 文章目录 目录 建造者模式 应用场景 代码示例 建造者模式 建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 => 装修 ...

  10. JAVA设计模式之【建造者模式】

    建造者模式 建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品 角色 Builder抽象建造者 buildPartX getResult ConcreteBuilder具体建 ...

最新文章

  1. 如何访问Linux服务器中RabbitMQ管理页面
  2. SQL SERVER2008 镜像
  3. OSS上传图片无法在线预览的解决方案
  4. Educational Codeforces Round 11C. Hard Process two pointer
  5. 数据结构--二叉树(1)
  6. 2010年度报告:是谁在编写Linux内核?
  7. 使用Grunt构建任务管理脚本(转)
  8. 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路
  9. Redis:15---键迁移(move、dump、restore、migrate)
  10. 引用传递和值传递的区别
  11. paip.php的调试--attilax总结
  12. 22_粗粒度权限控制
  13. python爬取电子病历_电子病历患者查询
  14. jar文件怎么打开 查看jar文件内容操作方法
  15. php 分享网 齐老师,令我难忘的齐老师
  16. java文件一行一行读取_java一行一行写入或读取文件
  17. Java:珠穆朗玛峰
  18. centos8 U盘制作及安装
  19. 积极重返中国的谷歌,这次瞄准了AI入口
  20. 【QT】自定义日历弹窗

热门文章

  1. C语言抽签(抽奖)小程序
  2. manjaro i3wm 的一些配置
  3. 基于孪生网络的单目标跟踪持续汇总
  4. eclipse连接sql数据库
  5. 将 .json 格式 转换成 .xml格式
  6. 软件工程大一至大四课程
  7. 个人介绍网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  8. LINUX 线程启动回调函数
  9. linux下od命令的使用教程,linux od命令详解
  10. SpringBoot+Mybatis-plus的员工打卡系统