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模式呢.通过搜索,会发现大部分网上的定义都是 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建 ...
随机推荐
- Android习惯——给全部Activity添加集合管理
title: 2017-3-23 Android习惯--给全部Activity添加集合管理 public void ActivityCollector{ public static List<A ...
- php判断是否引入某文件
Code: /* 判断是否引入了公共文件demo.php */ $include_files = get_included_files(); $include_files_exist = 0 ; fo ...
- java 对sql格式化
public class SqlFormat{ public static void main(String[] args){ String sql=""; sqlFormat(s ...
- [Windows Server 2008] IIS配置伪静态方法(Web.config模式的IIS rewrite)
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装伪静态(w ...
- RNN,LSTM,GRU基本原理的个人理解
记录一下对RNN,LSTM,GRU基本原理(正向过程以及简单的反向过程)的个人理解 RNN Recurrent Neural Networks,循环神经网络 (注意区别于recursive neura ...
- [Python3网络爬虫开发实战] 1.8.1-pyspider的安装
pyspider是国人binux编写的强大的网络爬虫框架,它带有强大的WebUI.脚本编辑器.任务监控器.项目管理器以及结果处理器,同时支持多种数据库后端.多种消息队列,另外还支持JavaScript ...
- layuiAdmin 项目修改
layuiAdmin修改 index.js 修改登录url user/login=>publics/login config.js 修改 name 项目名称, tokenName token字段 ...
- Spring Quartz 和 Spring Task使用比较
Quartz 和 Spring Task执行时间对比: 1. Quartz同步模式:一个任务的两次执行的时间间隔是:“执行时间”和“trigger的设定间隔”的最大值 2. Task默认同步模式:一个 ...
- Uva 12657 移动盒子(双向链表)
题意: 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.可以执行以下4种指令:1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y右 ...
- LeetCode 121. Best Time to Buy and Sell Stock (stock problem)
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...