Builder
Builder模式的使用情景
- 相同的方法, 不同的执行顺序, 产生不同的事件结果
- 多个部件或零件, 都可以装配到一个对象中, 但是产生的运行结果又不相同
- 产品类比较复杂, 或者产品类中的调用顺序不同产生了不同的作用.
- 当初始化一个对象特别复杂, 如参数多, 且很多参数都具有默认值.
Builder模式的整体构造

产品类
abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOS;
protected Computer(){
}
public void setBoard(String board){
mBoard=board;
}
public void setDisplay(String display){
mDisplay=display;
}
public abstract void setOS();
@Override
public String toString() {
return "Computer [mBoard="+ mBoard+", mDisplay="+mDisplay+", mOS="+mOS+"]";
}
}
class Macbook extends Computer{
protected Macbook(){
}
@Override
public void setOS() {
mOS="Mac OS X 10.10";
}
}
Builder类
//抽象Builder类
abstract class Builder{
public abstract void buildBoard(String board);
public abstract void buildDispaly(String display);
public abstract void buildOS();
public abstract Computer create();
}
//具体Builder类
class MacbookBuilder extends Builder{
private Computer mComputer=new Macbook();
@Override
public void buildBoard(String board) {
mComputer.setBoard(board);
}
@Override
public void buildDispaly(String display) {
mComputer.setDisplay(display);
}
@Override
public void buildOS() {
mComputer.setOS();
}
@Override
public Computer create() {
return mComputer;
}
}
导演类
导演类起到封装的作用, 避免高层模块深入到建造者内部的实现类
class Direcotr{
Builder mBuilder=null;
public Direcotr(Builder builder){
mBuilder=builder;
}
public void construct(String board,String dispaly){
mBuilder.buildBoard(board);
mBuilder.buildDispaly(dispaly);
mBuilder.buildOS();
}
}
public class BuildTest{
public static void main(String[] args){
Builder builder=new MacbookBuilder();
Direcotr pcDirector=new Direcotr(builder);
pcDirector.construct("intel","retina");
StdOut.println("Computer Info : "+builder.create().toString());
}
}
忽略Director类
在开发过程中, 可以忽略Director类, 直接使用Builder来进行对象的组装, 可以使用setter方法进行链式调用.
new Builder().setA("A").setB("B").create()
public class BuildTest {
public static void main(String[] args){
ConcreteProductA A= (ConcreteProductA)new A_Buider().setArg_1("aa")
.setArg_2("bb").create();
StdOut.print(A);
}
}
abstract class abstractProduct{
protected String arg_1;
protected String arg_2;
protected abstract void setArg_1(String arg_1);
protected abstract void setArg_2(String arg_2);
@Override
public String toString() {
return "arg_1: "+arg_1+", arg_2: "+arg_2;
}
}
class ConcreteProductA extends abstractProduct{
protected void setArg_1(String arg_1){
this.arg_1=arg_1;
}
protected void setArg_2(String arg_2){
this.arg_2=arg_2;
}
}
abstract class Builder {
public abstract Builder setArg_1(String arg_1);
public abstract Builder setArg_2(String arg_2);
public abstract abstractProduct create();
}
class A_Buider extends Builder{
private ConcreteProductA mConcreteProductA=new ConcreteProductA();
@Override
public Builder setArg_1(String arg_1) {
mConcreteProductA.setArg_1(arg_1);
return this;
}
@Override
public Builder setArg_2(String arg_2) {
mConcreteProductA.setArg_2(arg_2);
return this;
}
@Override
public abstractProduct create(){
return mConcreteProductA;
}
}

Builder的更多相关文章
- 23种设计模式--建造者模式-Builder Pattern
一.建造模式的介绍 建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...
- PHP设计模式(五)建造者模式(Builder For PHP)
建造者模式:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式. 设计场景: 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,爱好等信息,才能获得用 ...
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder
Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder 转自:ht ...
- Joshua Bloch错了? ——适当改变你的Builder模式实现
注:这一系列都是小品文.它们偏重的并不是如何实现模式,而是一系列在模式实现,使用等众多方面绝对值得思考的问题.如果您仅仅希望知道一个模式该如何实现,那么整个系列都会让您失望.如果您希望更深入地了解各个 ...
- c++ builder 2010 错误 F1004 Internal compiler error at 0x9740d99 with base 0x9
今天遇到一个奇怪的问题,拷贝项目后,在修改,会出现F1004 Internal compiler error at 0x9740d99 with base 0x9 ,不管怎么改,删除改动,都没用,关闭 ...
- c++ builder TIdHttp 获取不到cookie
用c++ builder 的TIdHttp组件Get一个ASP.Net MVC服务器的一个页面,获取页面中Cookie信息,修改后Post到服务器上去. 在本地调试的时候可以获取到,部署到服务器上就获 ...
- Builder模式在Java中的应用
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...
- 设计模式--建造者模式Builder(创建型)
一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...
- 使用SHFB(Sandcastle Help File Builder)建立MSDN风格的代码文档
使用SHFB(Sandcastle Help File Builder)建立MSDN风格的代码文档 下载地址:http://sandcastle.codeplex.com/ 下载地址2:http:// ...
随机推荐
- 【转】Mac OS X开机启动Path had bad permissions错误解决方案
原文网址:http://www.07net01.com/2015/07/884646.html 最近在安装mongodb的时候遇到了上述提示,在国内各大网站寻找解决方案无果,于是果断查看国外的网站,终 ...
- 嵌入式 使用mp4v2将H264+AAC合成mp4文件
录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...
- 嵌入式 fork与vfork的区别
fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1. fork ():子进程拷贝父进程的数据段,代码段 vfork ( ):子进程与父进程共享数据段 ...
- ASP.NET静态页生成
由于业务需要,得把页面按照模板页生成静态页面,所以自己就琢磨了下,写些思路,以备日后需要的时候用. 静态页生成用到最多的就是匹配跟替换了,首先得读取模板页的html内容,然后进行你自己定义的标签匹配, ...
- 常用的Oracle数据库语句 (待更新完毕)
一.常用的查询语句 1.1 常用查询 查表中有多少个字段 select count(*) from user_tab_columns where table_name=upper('表名') 或者 s ...
- 从今天开始写博客、托管代码到 Github
最近看了一篇文章,译名<简历危险>,原名<Resumes are dangerous>. 作者为Alex Maccaw,他有一篇文章曾经在网上流传甚广——<Traveli ...
- SQL存儲過程的調試方法
1.在vs2010调试存储过程步骤如下:(要點:連接登陸賬號的權限必須是管理員,才能單步調試,否則只能直接執行存儲過程:[因此,此方式適合數據庫和vs裝在同一台電腦上]) 1.1首先,打开vs,点击 ...
- 编译python3
安装环境 yum install gcc yum install zlib-devel yum install make 下载python版本 wget http://www.python.org/f ...
- 《学习OpenCV》练习题第四章第一题b&c
#include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...
- HDOJ-ACM1009(JAVA) (传说中的贪心算法)分为数组实现 和 封装类实现
转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5564311.html 这个道题有几点要注意的: 数组存放的类型:float或double 打印的格式:(如果只是 ...