Android设计模式学习(包含Java设计模式)-Builder模式-AJDesignMode03
来源:互联网 发布:金英杰免费网络课2017 编辑:程序博客网 时间:2024/06/01 10:35
3.1 Builder模式介绍
Builder模式是一步一步创建一个复杂对象的创建型模式。它允许用户在不知道内部细节的情况下,可以更精确地控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。
因为一个复杂的对象有很多大量组成成分,如:汽车,有车轮,方向盘,发动机,还有各种小零件等,如何将这些部件装配成一辆汽车,这个装配过程很漫长,也很复杂,对于这种情况,为了在构建过程中对外部隐藏实现细节,就可以使用Builder模式将部件和组装过程分离,使得构建过程和部件都可以自由扩展,两者之间的耦合也降到最低。
3.2 Builder模式的定义
将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
3.3 Builder模式的使用场景
(1)相同的方法,不同的执行顺序,产生不同的事件结果时。
(2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适。
(4)当初始化一个对象非常复杂,如参数多,且很多参数都具有默认值时。
3.4 Builder模式的UML类图
UML类图如下图所示:
角色介绍:
Protect产品类———产品的抽象类;
Builder———抽象Builder类,规范产品的组建,一般是由子类实现具体的组建过程;
ConcreteBuilder———具体的Builder类;
Director———统一组装过程;
3.5 Builder模式的简单实现
计算机的组装过程较为复杂,并且组装顺序是不固定的,为了易于理解,我们把计算机组装的过程简化成构建主机,设置操作系统,设置显示器3个部分,然后通过Director和具体的Builder来构建计算机对象。示例代码如下:
计算机抽象类,即Product角色
public abstract class Computer { protected String mBoard; protected String mDisPlay; protected String mOS; protected Computer(){ } public void setmBoard(String mBoard) { this.mBoard = mBoard; } public void setmDisPlay(String mDisPlay) { this.mDisPlay = mDisPlay; } public abstract void setOS(String OS); @Override public String toString() { return "Computer[mBoard="+mBoard+",mDisPlay="+mDisPlay+",mOS="+mOS+"]"; }}
具体的Computer类,MacBook
public class MacBook extends Computer { protected MacBook(){ } @Override public void setOS() { mOS = "Mac OS X 10.10"; }}
抽象Builder类
public abstract class Builder { //设置主机 public abstract void builderBoard(String board); //设置显示器 public abstract void builderDisplay(String display); //设置操作系统 public abstract void builderOS(); //创建Computer public abstract Computer create();}
具体的Builder类,MacbookBuilder
public class MacBookBuilder extends Builder { private Computer mComputer = new MacBook(); @Override public void builderBoard(String board) { mComputer.setmBoard(board); } @Override public void builderDisplay(String display) { mComputer.setmDisPlay(display); } @Override public void builderOS() { mComputer.setOS(); } @Override public Computer create() { return mComputer; }}
Director类,负责构造Computer
public class Director { Builder mBuilder = null; public Director(Builder builder){ mBuilder = builder; } //构建对象 public void construct(String board,String display){ mBuilder.builderBoard(board); mBuilder.builderDisplay(display); mBuilder.builderOS(); }}
测试类:
public class Test { public static void main(String[] args){ //构造器 Builder builder = new MacBookBuilder(); //Director Director pcDirector = new Director(builder); //封装构建过程,4核,内存2GB,Mac系统 pcDirector.construct("英特尔主板","Retina显示器"); //构建计算机,输出相关信息 System.out.println("Computer Info : "+builder.create().toString()); }}
输出结果:
Computer Info : Computer[mBoard=英特尔主板,mDisPlay=Retina显示器,mOS=Mac OS X 10.10]
上述示例中,通过具体的MacbookBuilder来构建Macbook对象,而Director封装了构建复杂产品对象的过程,对外隐藏构建细节。Builder与Director一起将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的对象。
值得注意的是,在现实开发过程中,Director角色经常会被忽略掉。而直接使用一个Builder来进行对象的组装,这个Builder通常为链式调用,它的关键点是每个setter方法都返回自身,也就是return this,这样就使得setter方法可以链式调用,代码大致如下:
new TestBuilder().setA("A").setB("B").create();
通过这种形式不仅去除了Director角色,整个结构也更加简单,也能对Product对象的组装过程有更精细的控制。比如,我们把上面的Builder类进行修改,代码如下:
修改Builder:
public abstract class Builder { //设置主机 public abstract Builder builderBoard(String board); //设置显示器 public abstract Builder builderDisplay(String display); //设置操作系统 public abstract Builder builderOS(); //创建Computer public abstract Computer create();}
修改MacbookBuilder:
public class MacBookBuilder extends Builder { private Computer mComputer = new MacBook(); @Override public Builder builderBoard(String board) { mComputer.setmBoard(board); return this; } @Override public Builder builderDisplay(String display) { mComputer.setmDisPlay(display); return this; } @Override public Builder builderOS() { mComputer.setOS(); return this; } @Override public Computer create() { return mComputer; }}
再次进行测试:
public class Test { public static void main(String[] args){ //构造器 Builder builder = new MacBookBuilder(); //直接通过builder构建计算机,然后输出相关信息 System.out.println("Computer Info : "+builder.builderBoard("因特尔主板").builderDisplay("Retina显示器").builderOS().create().toString()); }}
输出结果:
Computer Info : Computer[mBoard=因特尔主板,mDisPlay=Retina显示器,mOS=Mac OS X 10.10]
本篇文章大部分引用《Android设计模式解析与实战》,特此注明一下。
下篇文章:
使程序运行更高效————原型模式
传送门:待更新..
- Android设计模式学习(包含Java设计模式)-Builder模式-AJDesignMode03
- Android设计模式学习之Builder模式
- Android 设计模式学习之 Builder 模式
- 设计模式学习----Builder模式
- 设计模式学习--Builder
- Android设计模式--Builder模式
- android设计模式-Builder模式
- Android设计模式-Builder模式
- android设计模式:Builder模式
- java设计模式:Builder模式
- Java设计模式---Builder模式
- Java设计模式--Builder模式
- Java设计模式--builder模式
- JAVA设计模式-Builder
- java设计模式-Builder
- Android设计模式 Builder设计模式
- java设计模式--Builder设计模式
- Android设计模式学习(包含Java设计模式)-单例模式-AJDesignMode02
- Android传输数据时Rsa加密解密详解
- RESTful API 设计最佳实践
- java抽象类和抽象方法之间的关系
- #ifndef..#define..#endif和#pragma once的区别
- Java NIO 之 Buffer
- Android设计模式学习(包含Java设计模式)-Builder模式-AJDesignMode03
- Python数据处理pandas、numpy等第三方库函数笔记(持续更新)
- Windows重装系统
- oracle超出打开游标的最大数的原因和解决方案
- jeecg 上传时 多次点击确定按钮,就添加多次
- Linus实验楼笔记——第14节:正则表达式基础
- oracle中wm_concat()函数
- 《Java NIO》:Channel and Buffer (通道和缓冲区)
- typedef的使用与define的区别