前言
正所谓只要功夫深,铁杵磨成针,坚持不懈,水滴石穿。学习也要坚持不懈,慢慢积累,才能达到以量变促成质变。在前进的过程中也要保持好良好的心态,不急不燥,脚踏实地,一步一个脚印。
Builder Design Pattern 介绍
建造者模式(Builder Pattern)也叫做生成器模式,Builder Design pattern 是一种创建型模式,Builder模式所解决的问题与对象的创建有关。它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程,Builder模式是为了将构造复杂对象的过程和他的部件解耦。Android 中我们最常用的Builder模式是AlterDialog.Builder。
Builder 模式通常是以静态内部类的形式实现。
Builder Design Pattern 定义
将一个复杂对象的构建过程与他的表示分离,使得同样的构建过程可以创建不同的表示。
Builder Design Pattern 使用场景
- 需要太多的构造函数。
- 当初始化一个对象特别复杂,如参数多,并且很多参数具有默认值时。
- 配置类的构造器的构建,将配置与目标类隔离出来(参照Universal-Image_Loader)。
- 相同的方法,不同的执行顺序,产生不同的事件结果时。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果不同时。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。
Builder Design Pattern 通用UML类图
![Builder](/2016/08/03/BuilderDesignPattern/BuilderUml.png)
说明:
Product产品类
ConcreateBuilder 创建该产品的内部表示,并定义它的装配过程。Builder抽象建造者
规范产品的组建,一般是由子类实现。
ConcreateBuilder 具体建造者
实现抽象类定义的所有方法,并且返回一个组建好的对象。
Director导演类
负责安排已有模块的顺序,然后告诉Builder开始建造。
Builder Design Pattern 使用实例
标准化的建造者(Builder)模式使用实例
我们以组建一台自己心仪的台式机电脑为例;
电脑抽象类
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465/*** Created by iuni.life on 16/8/2.* 组建一台简单的台式机电脑,电脑抽象类 即Product角色*/public class Computer {//cpuprotected String mCpu = "intel i3-4150";//显示器protected String mDisplay = "21寸";//主板protected String mBoard = "华硕 B85";//电源protected String mPower = "安钛克 220V";//系统protected String mSysOs = "Dos";//主机箱protected String mMainBox = "先马";//鼠标protected String mMouse = "贱驴";//键盘protected String mKeyBoard = "cherry";//内存条protected String mSimm = "2*4G";//硬盘protected String mHardDisk = "希捷 1T";protected ComputerStant() {}public abstract void setSimm(String simm);public abstract void setHardDisk(String hardDisk);public abstract void setCpu(String cpu);public abstract void setDisplay(String display);public abstract void setBoard(String board);public abstract void setPower(String power);public abstract void setSysOs(String sysOs);public abstract void setMainBox(String mainBox);public abstract void setMouse(String mouse);public abstract void setKeyBoard(String keyBoard);public String toString() {return "ComputerStant{" +"mCpu='" + mCpu + '\'' +", mDisplay='" + mDisplay + '\'' +", mBoard='" + mBoard + '\'' +", mPower='" + mPower + '\'' +", mSysOs='" + mSysOs + '\'' +", mMainBox='" + mMainBox + '\'' +", mMouse='" + mMouse + '\'' +", mKeyBoard='" + mKeyBoard + '\'' +", mSimm='" + mSimm + '\'' +", mHardDisk='" + mHardDisk + '\'' +'}';}}电脑抽象类的具体实现,我们以Mac电脑为例
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859/*** Created by iuni.life on 16/8/2.**/public class MacComputer extends Computer {protected MacComputer() {}public void setSimm(String simm) {mSimm = simm;}public void setHardDisk(String hardDisk) {mHardDisk = hardDisk;}public void setCpu(String cpu) {mCpu = cpu;}public void setDisplay(String display) {mDisplay = display;}public void setBoard(String board) {mBoard = board;}public void setPower(String power) {mPower = power;}public void setSysOs(String sysOs) {mSysOs = sysOs;}public void setMainBox(String mainBox) {mMainBox = mainBox;}public void setMouse(String mouse) {mMouse = mouse;}public void setKeyBoard(String keyBoard) {mKeyBoard = keyBoard;}}Builder抽象类
1234567891011121314151617181920212223242526272829303132333435363738/*** Created by iuni.life on 16/8/2.* builder 抽象类*/public abstract class Builder {//创建显示器public abstract Builder buildDisplay(String display);//创建主板public abstract Builder buildBoard(String board);//创建电源public abstract Builder buildPower(String power);//创建cpupublic abstract Builder buildCpu(String cpu);//创建系统public abstract Builder buildSysOs(String sysOs);//创建主机箱public abstract Builder buildMainBox(String mainBox);//创建鼠标public abstract Builder buildMouse(String mouse);//创建键盘public abstract Builder buildKeyBoard(String keyBoard);//创建内存条public abstract Builder buildSimm(String simm);//创建硬盘public abstract Builder buildHardDisk(String hardDisk);//创建Computerpublic abstract ComputerStant create();}Builder 的具体实现,因为我们是要组装一个Mac 电脑,所以需要MacBuilder
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071/*** Created by iuni.life on 16/8/2.*/public class MacBuilder extends Builder {MacComputer macComputer = new MacComputer();public Builder buildDisplay(String display) {macComputer.setDisplay(display);return this;}public Builder buildBoard(String board) {macComputer.setBoard(board);return this;}public Builder buildPower(String power) {macComputer.setPower(power);return this;}public Builder buildCpu(String cpu) {macComputer.setCpu(cpu);return this;}public Builder buildSysOs(String sysOs) {macComputer.setSysOs(sysOs);return this;}public Builder buildMainBox(String mainBox) {macComputer.setMainBox(mainBox);return this;}public Builder buildMouse(String mouse) {macComputer.setMouse(mouse);return this;}public Builder buildKeyBoard(String keyBoard) {macComputer.setKeyBoard(keyBoard);return this;}public Builder buildSimm(String simm) {macComputer.setSimm(simm);return this;}public Builder buildHardDisk(String hardDisk) {macComputer.setHardDisk(hardDisk);return this;}public ComputerStant create() {return macComputer;}}Director 导演类
1234567891011121314151617181920212223242526/*** Created by iuni.life on 16/8/2.*/public class Director {Builder mBuilder = null;public Director(Builder mBuilder) {this.mBuilder = mBuilder;}//构建对象public void constract(String mCpu, String mDisplay, String mBoard, String mPower, String mSysOs, String mMainBox, String mMouse, String mKeyBoard, String mSimm, String mHardDisk) {mBuilder.buildCpu(mCpu);mBuilder.buildDisplay(mDisplay);mBuilder.buildBoard(mBoard);mBuilder.buildPower(mPower);mBuilder.buildSysOs(mSysOs);mBuilder.buildMainBox(mMainBox);mBuilder.buildMouse(mMouse);mBuilder.buildKeyBoard(mKeyBoard);mBuilder.buildSimm(mSimm);mBuilder.buildHardDisk(mHardDisk);//也可链式// mBuilder.buildMouse(mMouse).buildCpu(mCpu).buildPower(mPower);}}测试类 test
1234567891011121314151617181920/*** Created by iuni.life on 16/8/2.* 经典的Builder模式实现较为繁琐,文章后面会列举一个简单的*/public class Test {public static void main(String[] args) {//构造器Builder builder = new MacBuilder();//DirectorDirector director = new Director(builder);//封装构建过程director.constract("intel i7", "25寸", "华硕 B85", "安钛克220V", "Mac Os", "先马", "精灵 X5", "cherry", "2*8G", "希捷500G");//构建电脑,输出相关信息System.out.println("My Mac Computer Info:"+builder.create().toString());// 通过Builder来构建产品对象, 而Director封装了构建复杂产品对象对象的过程,对外隐藏构建细节。}}
说明
通过Builder来构建产品对象, 而Director封装了构建复杂产品对象对象的过程,对外隐藏构建细节。但是这种经典的写法有点小烦,有点繁琐,在要求不是很苛刻的情况下,我们可以用下面的方式进行实现。
一种简单的方式实现Builder模式
- 这种方式以Builder为静态内部类的方式实现,我们还是以组装一台自己的电脑为例。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133/*** Created by iuni.life on 16/8/2.* 组建一台简单的台式机电脑,电脑抽象类 即Product角色*/public class Computer {//cpuprivate String cpu;//显示器private String display;//主板private String board;//电源private String power;//系统private String sysOs;//主机箱private String mainBox;//鼠标private String mouse;//键盘private String keyBoard;//私有化构造函数 使之不能从外部创建实例private Computer() {}private void setCpu(String cpu) {this.cpu = cpu;}private void setDisplay(String display) {this.display = display;}private void setBoard(String board) {this.board = board;}private void setPower(String power) {this.power = power;}private void setSysOs(String sysOs) {this.sysOs = sysOs;}private void setMainBox(String mainBox) {this.mainBox = mainBox;}private void setMouse(String mouse) {this.mouse = mouse;}private void setKeyBoard(String keyBoard) {this.keyBoard = keyBoard;}public String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", display='" + display + '\'' +", board='" + board + '\'' +", power='" + power + '\'' +", sysOs='" + sysOs + '\'' +", mainBox='" + mainBox + '\'' +", mouse='" + mouse + '\'' +", keyBoard='" + keyBoard + '\'' +'}';}//Builder 静态内部类public static class ComputerBuilder {//创建computer实例private Computer computer = new Computer();//创建Cpupublic ComputerBuilder buildCpu(String cpu) {computer.setCpu(cpu);return this;}//创建显示器public ComputerBuilder buildDisplay(String display) {computer.setDisplay(display);return this;}//创建主板public ComputerBuilder buildBoard(String board) {computer.setBoard(board);return this;}//创建电源public ComputerBuilder buildPower(String power) {computer.setPower(power);return this;}//创建系统public ComputerBuilder buildSysOs(String sysOs) {computer.setSysOs(sysOs);return this;}//创建主机箱public ComputerBuilder buildMainBox(String mainBox) {computer.setMainBox(mainBox);return this;}//创建鼠标public ComputerBuilder buildMouse(String mouse) {computer.setMouse(mouse);return this;}//创建键盘public ComputerBuilder buildKeyBoard(String keyBoard) {computer.setKeyBoard(keyBoard);return this;}//组装电脑,并返回创建好的电脑public Computer create() {//这里可以做一些初始化操作以及一些逻辑判断if (computer==null){throw new IllegalStateException("computer is null");}return computer;}}}2.测试类
12345678910111213141516171819/*** Created by iuni.life on 16/8/2.*/public class main {public static void main(String[] args) {//创建Builder对象Computer.ComputerBuilder computerBuilder = new Computer.ComputerBuilder();//组装电脑,构建组装顺序computerBuilder.buildBoard("华硕");computerBuilder.buildCpu("intel i7");computerBuilder.buildDisplay("三星");computerBuilder.buildKeyBoard("cherry");computerBuilder.buildMainBox("杀神").buildMouse("贱驴").buildPower("安钛克").buildSysOs("Windoes 10");//组装成一个自己想要的的电脑。// computerBuilder 只需要知道客户想组装成什么样的电脑,并对客户不关心的如何安装进行了隐藏。Computer computer = computerBuilder.create();System.out.printf(computer.toString());}}
建造者(Builder)模式的优缺点
优点
- 封装性,使用建造者模式客户端不必知道产品内部的组成的细节。
- 建造者独立,容易拓展
缺点
- 会产生多余的Builder对象以及Director对象,消耗内存。
后记
文章不足之处,望大家多多指点,共同学习,共同进步。
参考资料
- <<设计模式之蝉>> 秦小波 著