android,【原创·教程·连载】《Android之大话设计模式》--设计模式 创建型模式 第五章:建造者模式

<大话设计模式>

本教程说明及版权声明

l 该文档参考和使用了网络上的免费开放的图片和内容,并以免费开放的方式发布,希望为移动互联网和智能手机时代贡献绵薄之力!可以随意转载,但不得使用该文档谋利。
l 如果对该文档有任何疑问或者建议,请进入官方博客
http://www.cnblogs.com/guoshiandroid/留言或者直接与国士工作室联系(后附联系方式),我们会慎重参考您的建议并根据需要对本文档进行修改,以造福更多开发者!
l 《大话设计模式》的最新及完整内容会在国士工作室官方博客定期更新,请访问国士工作室博客
http://www.cnblogs.com/guoshiandroid/获取更多更新内容。
国士工作室是一支专注于Android平台企业级应用开发的技术团队,致力于做中国最棒的Android应用程序开发机构,提供最棒的Android企业级应用开发培训服务。
企业培训和开发合作官方联系方式:
电话:18610086859
Email:[email protected]
QQ:1740415547
国士工作室 有你更美好!
建造者模式 让我们同居吧!
建造者模式应用场景举例
深陷爱河的GG和MM似乎一刻也不能离开彼此。
“让我们同居吧!”GG对MM说,“嗯”MM羞涩的点头应到。
天啊,这个世界是怎么了?果然,恋爱中的男生是疯子,恋爱中的女生是傻子!这疯子和傻子在一块真不知道会做出什么好事来^_^
既然都迫不及待的药同居,是先要解决房子的问题的。
GG在学校附近转了几天,问了很多人,最后确定了一处离学校大约500米远的两室一厅的房间,所处位置是挺好的,很温馨,环境很美。
GG想,既然同居,不能太无趣MM啊,就想着要把房屋装修一番,像要布置一些家具啊、购买厨具啊。当然,这个傻GG是不会做这些东西的。而比较不幸的是,整天沉浸在爱河中的GG对学校周围的环境是一点也不熟悉,无奈之下,GG只有请房东帮忙了。房东说这个是小问题,只是开支有些高,我们先规划一下,然后请装修师傅直接过来装修就行了。经过两人近半天的商讨,最终确定了方案。哥哥忍着心痛预付给了房东两千元的装修费,接下来就是要等待装修好的消息了。然后是和MM搬进去住。
建造者模式解释:
建造者模式(Builder Pattern)又叫生成器模式,是GoF提出的23种设计模式中的一种。
建造者模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
英文定义为:Separate the construction of a complex object from its representation so that the same construction process can create different representations.
建造者模式的UML图:
建造者模式涉及以下的角色:
抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。此接口中一般至少规定两个方法,一个是创建部分的方法,例如BuilderPart,另一个是返回结果的方法,例如GetProduct,以约束具体建造者实现。 具体建造者(ConcreteBuilder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序的调用下创建产品的实例。这个角色产品实现了抽象建造者接口,主要完成分步创建产品并提供产品对象的实例。 导演者(Director)角色:顾名思义,就是具体指挥使用哪个具体创造者来完成产品的创建,是创建工作的调用者。但是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。 产品(Product)角色:产品角色就是建造中的复杂对象。一般只有对于复杂对象的创建才使用建造者模式,一个系统中会出现多于一个的产品类,而这些产品类并不一定有共同的接口,可能完全不关联,这时就需要提供多套抽象和具体的建造者来完成不一致的产品的创建或者是采用一个统一接口来标识产品。
建造者模式的UML图如下所示:
建造者模式深入分析
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。
建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。
建造者模式使用场景分析及代码实现:
在上面的使用场景中,深陷爱河的GG和MM打算同居,首先要装修房子。对于装修房子而言,房东就相当于导演者(Director),房东决定使用那个装修公司;而装修公司一般都是遵循统一装修标准的,这里的统一装修标准就相当于抽象建造者(Builder)角色;房东寻找的具体装修公司就是具体建造者(ConcreteBuilder)角色;而房屋就相当于产品(Product)角色。
UML模型图如下所示:
建立一个房屋类:
package com.diermeng.designPatter.Builder.impl;
/*
* GG和MM的爱巢
*/
public class LoveNest {
// 地板
private String floor;
// 墙
private String wall;
// 屋顶
private String housetop;
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getHousetop() {
return housetop;
}
public void setHousetop(String housetop) {
this.housetop = housetop;
}
}

建立装修公司的抽象接口:
package com.diermeng.designPatter.Builder;
import com.diermeng.designPatter.Builder.impl.LoveNest;
/*
* 装修公司的抽象接口
*/
public interface HouseBuilder {
//修地板
public void makeFloor();
//修墙
public void makeWall();
//修屋顶
public void makeRoof();
//房屋的返回方法
public LoveNest getHouse();
}
建立具体的装修公司:
package com.diermeng.designPatter.Builder.impl;
import com.diermeng.designPatter.Builder.HouseBuilder;
/*
* 为GG和MM建造爱巢的公司
*/
public class LoveNestBuilder implements HouseBuilder{
LoveNest loveNest = new LoveNest();
public LoveNest getHouse() {
return loveNest;
}
public void makeFloor() {
loveNest.setFloor("爱巢的地板装修好了^_^");
}
public void makeRoof() {
loveNest.setHousetop("爱巢的屋顶装修好了^_^");
}
public void makeWall() {
loveNest.setWall("爱巢的墙体装修好了^_^");
}
}
建立装修公司的Director类:
package com.diermeng.designPatter.Builder.impl;
import com.diermeng.designPatter.Builder.HouseBuilder;
/*
* 房屋装修的Director角色,在方法中确定最终选择哪个具体的装修公司
*/
public class HouseDirector {
public void makeHouse(HouseBuilder builder) {
builder.makeFloor();
builder.makeWall();
builder.makeRoof();
}
}
最后我们建立测试客户端:
package com.diermeng.designPatter.Builder.client;
import com.diermeng.designPatter.Builder.HouseBuilder;
import com.diermeng.designPatter.Builder.impl.LoveNest;
import com.diermeng.designPatter.Builder.impl.HouseDirector;
import com.diermeng.designPatter.Builder.impl.LoveNestBuilder;
/*
* 测试客户端
*/
public class BuilderTest {
public static void main(String[] args) {
//由具体的装修公司来装修
HouseBuilder builder = new LoveNestBuilder();
//建立一个设计者
HouseDirector director = new HouseDirector();
//把具体的装修公司交给设计者
director.makeHouse(builder);
//返回房屋
LoveNest loveNest = builder.getHouse();
//显示装修效果
System.out.println(loveNest.getFloor());
System.out.println(loveNest.getWall());
System.out.println(loveNest.getHousetop());
}
}
输出的结果如下:
爱巢的地板装修好了^_^
爱巢的墙体装修好了^_^
爱巢的屋顶装修好了^_^

建造者模式的优缺点分析:
优点:
在建造者模式中,客户端不用在直接负责对象的创建,而是把这任务交给了具体的创建者类,把具体的如何组装的责任交给了Director类,客户端之负责对象的调用即可,符合单一职责原则。而且由于可以选择不同的具体的创建者,所以可以有不同的形式展现对象。
缺点:
创建者模式比较符合产品差别不大的对象的创建,如果差别很大,就会导致非常多的具体的创建者,这时候最好结合工厂方法模式。
建造者模式的实际应用简介:
对象的创建:Builder模式是为对象的创建而设计的模式
创建的是一个复合对象:被创建的对象为一个具有复合属性的符合对象
关注对象创建各部分的创建过程,不同的工厂对产品的属性有不同的创建的方法。
温馨提示:
建造者模式是为了解决复合对象的创建而生的,建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。有利明确各部分的职责目标,有利于软件结构的优化。
GG和MM同居的爱巢需要装修,这固然省去了麻烦,但是是要花费钞票的,毕竟,凡事都是有两面性的嘛^_^

Tags: 

延伸阅读

最新评论

发表评论