Builder设计模式
Builder模式,又称生成器或构建者模式,属于对象创建型模式,侧重于一步一步的构建复杂对象,只有在构建完成后才会返回生成的对象。Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
一、使用场景
1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时,比如买一台电脑,我不需要知道电脑CPU,主板,机箱是如何生产的,也不需要知道它们是如何组装的。
2、当构造过程必须允许被构造的对象有不同的表示时,比如一台电脑即可以使用AMD的CPU,也可以使用Inter的CPU,这些都是可以根据需求变化的。
/**
* 构建者模式:将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。
*
* @author qbg
*
*/
public class BuilderPattern {
/**
* 机箱抽象类
*/
abstract class Crate {
public String toString() {
return "abstract crate...";
}
} /**
* 酷冷至尊机箱
*/
class CoolerMasterCrate extends Crate {
public String toString() {
return "CoolerMaster crate...";
}
} /**
* CPU抽象类
*/
abstract class CPU {
public String toString() {
return "abstract cpu...";
}
} /**
* AMD CPU
*/
class AMDCPU extends CPU {
public String toString() {
return "AMD cpu...";
}
} /**
* 主板抽象类
*/
abstract class Motherboard {
public String toString() {
return "abstract motherboard...";
}
} /**
* 华硕主板
*/
class ASUSMotherboard extends Motherboard {
public String toString() {
return "ASUS motherboard...";
}
} /**
* 电脑定义类
*/
class Computer {
CPU cpu; // cpu
Motherboard motherboard; // 主板
Crate crate;// 机箱 public String toString() {
return "CPU:" + cpu + "\nMotherboard:" + motherboard + "\nCrate:"
+ crate;
}
} /**
* 电脑构建者接口,可以将CPU等部件通过工厂模式来生产,以进一步分离产品部件生成和构建的过程...
*/
interface ComputerBuilder {
public ComputerBuilder buildCPU(); public ComputerBuilder buildMotherboard(); public ComputerBuilder buildCrate(); public Computer getProduct();
} /**
* 最热台式电脑构建实现类
*/
class HotDeskComputerBuilder implements ComputerBuilder {
private Computer computer; public HotDeskComputerBuilder() {
this.computer = new Computer();
} public ComputerBuilder buildCPU() {
computer.cpu = new AMDCPU();
return this;
} public ComputerBuilder buildMotherboard() {
computer.motherboard = new ASUSMotherboard();
return this;
} public ComputerBuilder buildCrate() {
computer.crate = new CoolerMasterCrate();
return this;
} public Computer getProduct() {
buildMotherboard().buildCPU().buildCrate();
return computer;
}
} /**
* 导向器,客户端通过导向器获取产品, 而不关心导向器是怎样获取到Builder生成器 构建的产品对象的。而具体的构建过程则交给具体的Builder。
*/
class Director {
private ComputerBuilder builder; public Director(ComputerBuilder builder) {
this.builder = builder;
} /**
* 返回构造好的产品
*/
public Computer construct() {
return builder.getProduct();
}
} public static void main(String[] args) {
BuilderPattern bp = new BuilderPattern();
ComputerBuilder builder = bp.new HotDeskComputerBuilder();
Director director = bp.new Director(builder);
Computer computer = director.construct();
System.out.println(computer);
}
}
模式优缺点
优点:
1、可以改变一个产品的内部表示,比如示例中只要实现一个新的ComputerBuilder就能改变电脑的内部组件,因为电脑的表示和内部结构是独立于客户端代码的。
2、将构造代码和表示代码分离,构造代码相当于builder,表示代码相当于director。不同的导向器可以使用相同的生成器也构造不同的产品。
Builder设计模式的更多相关文章
- C#创建IIS站点及相应的应用程序池,支持IIS6.0+Windows Server 2003. 使用Builder设计模式
测试项目结构: PS:IIS6UtilsBuilder, IIS7UtilsBuilder,IISUtilsBuilder以及IISDirector为Builder设计模式实现的核心代码.Progra ...
- Java调用FFmpeg进行视频处理及Builder设计模式的应用
1.FFmpeg是什么 FFmpeg(https://www.ffmpeg.org)是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它用来干吗呢?视频采集.视频格式转化.视频 ...
- Builder设计模式--改善构造器多个参数时可显著改善可读性
作为一名程序开发者,设计模式其实一直有在接触,只是没有专门的去学过,所以可能对设计模式没有一个系统的理解.在一次项目中,需要使用到第三方服务商提供的功能,为了尽快的熟悉其功能代码,在官网下了demo来 ...
- builder设计模式(摘录ITeye文章lintomny)
对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程的Director要.刚才google到一篇文章,总算清楚了.在这里转贴一下 ...
- Builder 设计模式的学习
Buileder(生成器)—对象创建型模式 一 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 二 适用性 在以下情况使用Build模式: 1 当创建复杂对象的算法应 ...
- [DesignPattern]Builder设计模式
模式的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 模式的使用场景 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部件或零件,都可以装配到一个对象中,但是 ...
- 23种设计模式之Builder设计模式
概述 建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在 ...
- [学习笔记]设计模式之Builder
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 作为一个新入职的魔导士呢,哦不,是程序员,我以为并没有太多机会去设计项目的软件架构.但是,工作一段时间之后,自己渐渐意识到,哪怕是自己 ...
- Android开发中常见的设计模式(二)——Builder模式
了解了单例模式,接下来介绍另一个常见的模式--Builder模式. 那么什么是Builder模式呢.通过搜索,会发现大部分网上的定义都是 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建 ...
随机推荐
- http的请求与响应-----content-type
content-type 指请求消息头的中请求消息数据的格式 有三种用法 第一种:设置在request header的参数中 js中可以在发送请求前在请求消息头中设置content-typevar x ...
- java-IO操作性能对比
在软件系统中,IO速度比内存速度慢,IO读写在很多情况下会是系统的瓶颈. 在java标准IO操作中,InputStream和OutputStream提供基于流的IO操作,以字节为处理单位:Reader ...
- 迅为I.MX6Q开发板配不同分辨率不同尺寸液晶屏幕
I.MX6Q开发板: 核心板参数 尺寸:51mm*61mm iMX6Q四核CPU:Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz iMX6DL双核CPU:Freesc ...
- 迅为工业级arm开发板i.MX6DL开发板软件硬件全开源
i.MX6是基于ARM Cortex™-A9架构的高扩展性多核系列应用处理器,促进了如高稳定性工业平板电脑.差异化智能本.前装车载中控系统和超高清电子书阅读器等新一代应用的发展.强劲的3D图形加速引擎 ...
- ubuntu 网卡配置
- go的指针学习
1)指针是什么? 一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址 说白了就是可以先存储内存的地址,在用内存地址找到对应值 2)go中的使用 Go 语言的取地址符是 &,放到一个 ...
- jQuery-图片的放大镜显示效果方法封装
(function($){ $.fn.jqueryzoom = function(options){ var settings = { xzoom: 200, //zoomed width defau ...
- 关于js事件冒泡和事件捕获
事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件.相反的,事件冒泡是自下而上的去触发事件.绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获.true,事件捕获: ...
- group by两个条件
学生表: 成绩表: 问题:统计各系各门课程的平均成绩 答案: select sdept,cno,AVG(grade)avg_grade from S join SC on S.sno = SC.sno ...
- CSU 2018年12月月赛 A 2213: Physics Exam
Description 高中物理老师总认为给学生文本形式的问题比给纯计算形式的问题要求更高.毕竟,学生首先得阅读和理解问题. 因此,他们描述一个问题不像”U=10V,I=5A,P=?”,而是”有一个含 ...