又是一个开学季,新生们都纷纷入学了。上了大学,买电脑便是每位学生要考虑的事情,作为计算机学院的一员,自然想买配置高点的电脑用来编码,这样会使用得舒服很多。可是手头又紧,想买配置好的电脑有时就会考虑自己去组装电脑。
那么,在这里就用Builder(建造者)模式来描述一下组装电脑这件事。先贴个UML图:

首先,需要一个抽象类——电脑:

public abstract class Computer {private String mCPU;private String mDisplay;private String mMemory;//配置CPUpublic void setmCPU(String mCPU) {this.mCPU = mCPU;}//配置显示器public void setmDisplay(String mDisplay) {this.mDisplay = mDisplay;}//配置内存public void setmMemory(String mMemory) {this.mMemory = mMemory;}public String listHardware() {return "CPU:" + mCPU + ",显示器:" + mDisplay + ",内存:" + mMemory;}
}

然后接着写一个子类MyComputer:

public class MyComputer extends Computer{protected MyComputer() {};
}

好了,这时候已经和卖家沟通好要组装一部电脑,那么准备组装,首先需要一个抽象类Builder用来组装电脑:

public abstract class Builder {//组装CPUpublic abstract Builder buildCPU(String cpu);//组装显示器public abstract Builder buildDisplay(String display);//组装内存public abstract Builder buildMemory(String memory);//完成组装public abstract Computer create();
}

接着,需要一个MyComputerBuilder来实现具体组装:

public class MyComputerBuiler extends Builder{private Computer mComputer = new MyComputer();@Overridepublic Builder buildCPU(String cpu) {mComputer.setmCPU(cpu);return this;}@Overridepublic Builder buildDisplay(String display) {mComputer.setmDisplay(display);return this;}@Overridepublic Builder buildMemory(String memory) {mComputer.setmMemory(memory);return this;}@Overridepublic Computer create() {return mComputer;}}

一切准备就绪,就能我们说需要配置哪些硬件了:

public class Buyer {public static void main(String[] args) {//初始化建造器Builder builer = new MyComputerBuiler();//需要的配置为Intel CPU,AOC显示器,8G内存Computer computer = builer.buildCPU("Intel").buildDisplay("AOC").buildMemory("8G").create();System.out.println(computer.listHardware());}
}

看看结果,一个电脑组装出来了!

CPU:Intel,显示器:AOC,内存:8G

上述便是Builder模式的一个简单的例子。

Builder模式在Android中的应用

相信这个应用大家都不会陌生,那就是:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("TestDialog").setMessage("This is a dialog!").setPositiveButton("OK", null).setNegativeButton("Cancel", null).create().show();

在Android中,我们比较常用的AlertDialog就使用了建造者模式,具体看看是如何实现的:

public class AlertDialog extends AppCompatDialog implements DialogInterface { //AlertController 为弹窗的控制器,在该类里面具体实现了设置dialogprivate AlertController mAlert;AlertDialog(Context context, int theme, boolean createThemeContextWrapper) {super(context, resolveDialogTheme(context, theme));mAlert = new AlertController(getContext(), this, getWindow());}protected AlertDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {super(context, resolveDialogTheme(context, 0));setCancelable(cancelable);setOnCancelListener(cancelListener);//实例化AlertController mAlert = new AlertController(context, this, getWindow());}@Overridepublic void setTitle(CharSequence title) {//调用AlertController 中的setTitle方法mAlert.setTitle(title);}public static class Builder {//属性P为用户设置的各种参数private final AlertController.AlertParams P;private int mTheme;public Builder(Context context) {this(context, resolveDialogTheme(context, 0));}//构造器public Builder(Context context, int theme) {P = new AlertController.AlertParams(new ContextThemeWrapper(context, resolveDialogTheme(context, theme)));mTheme = theme;}//设置确认按钮public Builder setPositiveButton(CharSequence text, final OnClickListener listener) {P.mPositiveButtonText = text;P.mPositiveButtonListener = listener;return this;} //设置取消按钮public Builder setNegativeButton(CharSequence text, final OnClickListener listener) {P.mNegativeButtonText = text;P.mNegativeButtonListener = listener;return this;} public AlertDialog create() {//构造一个AlertDialog,并将设置的参数传入final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);//将P中的属性应用到AlertController P.apply(dialog.mAlert);//设置各种按钮监听接口dialog.setCancelable(P.mCancelable);if (P.mCancelable) {dialog.setCanceledOnTouchOutside(true);}dialog.setOnCancelListener(P.mOnCancelListener);dialog.setOnDismissListener(P.mOnDismissListener);if (P.mOnKeyListener != null) {dialog.setOnKeyListener(P.mOnKeyListener);}return dialog;}//展示窗口,不深入具体细节public AlertDialog show() {AlertDialog dialog = create();dialog.show();return dialog;}}
}

可以看到上述通过apply方法来实现了设置窗口:

 public void apply(AlertController dialog) {//应用各种属性if (mCustomTitleView != null) {dialog.setCustomTitle(mCustomTitleView);} else {if (mTitle != null) {dialog.setTitle(mTitle);}if (mIcon != null) {dialog.setIcon(mIcon);}if (mIconId != 0) {dialog.setIcon(mIconId);}if (mIconAttrId != 0) {dialog.setIcon(dialog.getIconAttributeResId(mIconAttrId));}}if (mMessage != null) {dialog.setMessage(mMessage);}if (mPositiveButtonText != null) {dialog.setButton(DialogInterface.BUTTON_POSITIVE, mPositiveButtonText,mPositiveButtonListener, null);}//省略部分代码}

这样,一个dialog就展示出来了。

Builder模式的优缺点

  • 优点
    -体现了良好封装性,容易扩展。
  • 缺点
    -产生了多余的Builder对象,消耗内存。

Builder模式——组装电脑相关推荐

  1. 建造者模式(Builder)——从组装电脑开始

    建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...

  2. 设计模式:建造模式(组装电脑)

    一. 实验目的 了解建造模式创建复杂对象的基本思路和方法,熟悉该模式中各个对象角色的基本功能. 理解建造模式在进行复杂对象创建中,是如何实现复杂对象的构建过程与表示分离的. 熟悉建造模式的类图结构,并 ...

  3. [Andriod设计模式之旅]——Builder模式

    版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758. https://blog.csdn.net/u013132758/article/deta ...

  4. 「设计模式(六) - Builder模式」

    「设计模式(六) - Builder模式」 一.可定制化的 电脑的组装在生活中并不陌生,大家都有电脑,当然需求不一样配置也不一样.以Macbook Pro为例,像UI设计对图像模块GPU要求比较高,跑 ...

  5. 设计模式--builder 模式

    设计模式–builder 模式 说明 @author JellyfishMIX - github / blog.jellyfishmix.com LICENSE GPL-2.0 本文默认已经知道了 b ...

  6. 设计模式初探-Builder模式

    Builder模式,又称生成器或构建者模式,属于对象创建型模式,侧重于一步一步的构建复杂对象,只有在构建完成后才会返回生成的对象.Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过 ...

  7. 可扩展性的builder模式的构建方法

    http://www.cnblogs.com/happyhippy/archive/2010/09/01/1814287.html 使用builder模式的时候: 本篇文章的原因:builder模式接 ...

  8. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

  9. Android设计模式之——Builder模式

    一.介绍 Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程.该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程 ...

最新文章

  1. wamp下php无法保存SESSION问题总汇
  2. 如何解决error: failed to push some refs to ‘xxx(远程库)‘
  3. 在无IIS下用SharpDevelop进行Asp.net 开发
  4. python打印九九加法表_Python小脚本
  5. 关于javaScript注册事件传递参数的浅析
  6. 【编撰】linux IPC 001 - 概述
  7. Spring Boot应用的打包和部署
  8. Oracle中CHAR类型不足位数时,用空格自动补足位数
  9. 分层结构、协议、接口、服务
  10. NP、P、NPC、NP-hard 概念辨析
  11. 【深入理解JS核心技术】14. 什么是一元函数
  12. gradle Could not resolve 依赖包
  13. 怎样删除手机自带软件?
  14. java数据类型ppt,Java语言基础01数据类型02.ppt
  15. Yahoo!团队实践分享:网站性能优化的35条黄金守则
  16. 中拓互联携手企信易为企业构建信息,传递信任
  17. svg格式的图片怎么放到word中?用这3种方法轻松解决!
  18. 中国 省会 地级市 经纬度 city array
  19. 谷歌地球不能用了?我敢说大部分人不知道真实原因
  20. 厂长来了 | 从个人英雄到软件工程,我们经历了什么

热门文章

  1. 【GEE】 【初探 GEE 账号申请与注册】
  2. 小说网站,小说阅读器,小说阅读网站毕业设计
  3. 新品上市的软文怎么写?产品软文撰写实用技巧
  4. WebXml.com.cn 中国股票行情数据 WEB 服务(支持深圳和上海股市的全部基金、债券和股票),数据即时更新...
  5. 425 Can‘t open data connection for transfer of “/“
  6. XX行网上贵金属交易项目
  7. 用midi2audio实现midi转wav、mp3
  8. Python-推导式
  9. Vue笔记(狂神说)
  10. 网站美工设计学习笔记-开篇