Builder模式的使用情景

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

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的更多相关文章

  1. 23种设计模式--建造者模式-Builder Pattern

    一.建造模式的介绍       建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...

  2. PHP设计模式(五)建造者模式(Builder For PHP)

    建造者模式:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式. 设计场景: 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,爱好等信息,才能获得用 ...

  3. 每天一个设计模式-7 生成器模式(Builder)

    每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...

  4. Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder

    Stack Overflow 排错翻译  - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder 转自:ht ...

  5. Joshua Bloch错了? ——适当改变你的Builder模式实现

    注:这一系列都是小品文.它们偏重的并不是如何实现模式,而是一系列在模式实现,使用等众多方面绝对值得思考的问题.如果您仅仅希望知道一个模式该如何实现,那么整个系列都会让您失望.如果您希望更深入地了解各个 ...

  6. c++ builder 2010 错误 F1004 Internal compiler error at 0x9740d99 with base 0x9

    今天遇到一个奇怪的问题,拷贝项目后,在修改,会出现F1004 Internal compiler error at 0x9740d99 with base 0x9 ,不管怎么改,删除改动,都没用,关闭 ...

  7. c++ builder TIdHttp 获取不到cookie

    用c++ builder 的TIdHttp组件Get一个ASP.Net MVC服务器的一个页面,获取页面中Cookie信息,修改后Post到服务器上去. 在本地调试的时候可以获取到,部署到服务器上就获 ...

  8. Builder模式在Java中的应用

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  9. 设计模式--建造者模式Builder(创建型)

    一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...

  10. 使用SHFB(Sandcastle Help File Builder)建立MSDN风格的代码文档

    使用SHFB(Sandcastle Help File Builder)建立MSDN风格的代码文档 下载地址:http://sandcastle.codeplex.com/ 下载地址2:http:// ...

随机推荐

  1. 【转】bash调试经验

    原文网址:http://blog.csdn.net/yfkiss/article/details/8636758 bash是Unix/Linux操作系统最常用的shell之一,它非常灵活,和awk.c ...

  2. DBA一天干的活

    一.检查活动状态 通过查询基本视图,确认数据库和实例处于正常运行状态,可以对外提供数据服务. 1.1实例状态 SELECT instance_name,status FROM v$instance; ...

  3. Linux共享内存(一)

    inux系统编程我一直看 <GNU/LINUX编程指南>,只是讲的太简单了,通常是书和网络上的资料结合着来掌握才比较全面 .在掌握了书上的内容后,再来都其他资料 . 原文链接 http:/ ...

  4. hdu 4301(基本dp)

    题意:就是给你一块2*n的巧克力,让你把它分成x块,并且每一个单位的巧克力各不相同,问有多少种分法? 分析:用dp[i][j][k],表示到巧克力的第二列时,巧克力被分成了j快,k用来表示第i列上下两 ...

  5. mysql优化SQL语句的一般步骤及常用方法

    一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...

  6. Yii系列教程(四):使用Memcache保存会话

    1环境准备 安装Memcached服务端: yum -y installmemcached.x86_64 安装PHP-Memcache扩展: yum -y installphp-pecl-memcac ...

  7. hdu5248 序列变换

    百度之星的题.其实最简单的方法是二分答案,我竟然没想到,直接去想O(n)的去了,最后导致滚粗... 题意就是给一个数列,要求把它处理成递增序列. 首先我想到了O(n^2)的算法,然后再优化成O(n)过 ...

  8. selenium python (十五)控制滚动条操作

    #!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #一般用到操作滚动条的两个场景    #注册时的法律条文的阅读,判断用户 ...

  9. Ioc注入方式写dubbo client(非set beans)

    @Autowired注解的方式注解 Spring框架中进行注入式,使用@Autowired. @Autowired可以对成员变量.方法和构造函数进行标注,来完成自动装配的工作,这里必须明确:@Auto ...

  10. jQuery文本框(input textare)事件绑定方法教程

    jquery 的事件绑定已经用on替换了原来的bind,接下来为大家分享下bind的使用方法及input textare事件.目前1.7以上,jquery?的事件绑定已经用on替换了原来的bind,接 ...