(@WhiteTaken)设计模式学习——建造者模式
Builder模式,也就是建造者模式或者生成器模式,是GoF提出的23种设计模式的一种。
这种模式是用来隐式的创建复合对象而提出来的。
创建复合对象的过程,不在主客户端显示。
下面直接上代码。以修建房屋为例子。
1.修建房屋,我们需要实例化一个房子,房子需要能修建门、地板、墙壁等。这时候我们需要有一个房子类。我们需要为其添加get set方法。
/*
* 房子 可以修建门窗、地板、墙
*/
public class House {
private String door;
private String floor;
private String wall; public String getDoor() {
return door;
}
public void setDoor(String door) {
this.door = door;
}
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;
}
}
2.但是我们发现,我们想要修建房子,在主客户端中我们需要创建一个房子的实例,然后调用其各种set方法,创建这个房子的属性。这样确实可以修建一个简单的房子,但是房子是有不同种类的,比如平房、公寓、写字楼、住宅等等。
这样的话,我们需要用尽量简洁的代码在主客户端建造我们的房子。我们把修建房子的工作交给工程队完成,但是不同的工程队,修建的房子的类型是不同的。所以我们需要把工程队抽象成一个接口。
/*
* 房屋建造者(工程队) 修建不同的房子 ,建造者不同, 公寓、平房、商业住宅
*/
public interface HouseBuilder {
public void makeDoor();
public void makeFloor();
public void makeWall();
public House returnHouse();
}
3.能实现这个接口的类,当然就是不同的工程队啦。我们这时候可以派遣两个工程队分别完成公寓和住宅的建造任务。修建完毕需要返回修建好的住宅验收。
/*
* 修建公寓的建造者,需要实现修建门、地板、墙的方法
*/
public class GoogyuBuilder implements HouseBuilder { House house =new House();
public void makeDoor() {
house.setDoor("WhiteTaken--公寓--门");
} public void makeFloor() {
house.setFloor("WhiteTaken--公寓--地板");
} public void makeWall() {
house.setWall("WhiteTaken--公寓--墙");
} public House returnHouse(){
return house;
}
} /*
* 住宅的建造者需要修建门、地板、墙
*/
public class ZhuzhaiBuilder implements HouseBuilder { House house= new House(); public void makeDoor() {
house.setDoor("WhiteTaken--住宅--门");
} public void makeFloor() {
house.setFloor("WhiteTaken--住宅--地板");
} public void makeWall() {
house.setWall("WhiteTaken--住宅--墙");
} public House returnHouse(){
return house;
}
}
4.但是我们只有上边的这部分还不是特别完美。我们想修建不同的房子,就得去调用不同建造者的make方法。在主客户端并不是好,因为会写入重复的代码。
这是我们可以添加设计师类,设计师可以调用不同的工程队,完成不同的工作。
/*
* 设计师负责建造房子,建造不同的房子,需要不同的工程队
*/
public class HouseDirector {
public static void SetBuilder(HouseBuilder houseBuilder)
{
houseBuilder.makeDoor();
houseBuilder.makeFloor();
houseBuilder.makeWall();
}
}
5.好,这时候我们可以在主客户端建造我们的房子。
public class MainClass {
public static void main(String[] args) {
//HouseBuilder builder=new GoogyuBuilder();//公寓建造者
HouseBuilder builder=new ZhuzhaiBuilder();//住宅建造者
HouseDirector.SetBuilder(builder);//设计师让建造者建造不同的房屋
House house=builder.returnHouse();//验收房屋
System.out.println(house.getDoor());
System.out.println(house.getFloor());
System.out.println(house.getWall());
}
}
打印的结果。
1.当实例化一个公寓建造者,情况如下。
2.当实例化一个住宅建造者,情况如下。
以上打印过程,我们只需要实例化不同的建造者就可以完成。即在主客户端中我们仅仅修改了少量的代码就完成了大部分的工作。极大的提高了效率和可拓展性。
建造者模式在哪里使用?
1.对象的创建,此模式是为对象的创建而设计的模式。
2.创建一个复合对象时可以用到,且创建的过程不需要让外界知道。
3.不同的工厂对产品属性有不同的创建方法,如果建造者不同,创建的复合对象是不同的。
(@WhiteTaken)设计模式学习——建造者模式的更多相关文章
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- 【GOF23设计模式】建造者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- java的23种设计模式之建造者模式
场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...
- python设计模式之建造者模式
python设计模式之建造者模式 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...
- C#设计模式(5)——建造者模式(Builder Pattern)
一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...
- 设计模式学习--复合模式(Compound Pattern)
设计模式学习--复合模式(Compound Pattern) 概述 ——————————————————————————————————————————————————— 2013年8月4日<H ...
- C++设计模式之建造者模式(三)
4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
随机推荐
- iOS开发——打电话
1.调用 自带mail [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://55522555 ...
- cocos2d中box2d讲解一
在游戏中我们经常要加入物理碰撞等和物理有关的内容,在游戏中加入物理引擎可以使我们的游戏更加真实,为玩家展示一个更真实的世界,cocos2d-x支持两个物理引擎Box2d和Chipmunk,本文介绍bo ...
- mongodb学习(一)
重点是踏出第一步: 1. 各种资料集合,mongodb的介绍,安装,破解...内容大同小异... http://www.cnblogs.com/kuochin/p/3599630.html;http: ...
- [Poi2000]公共串 && hustoj2797
传送门:http://begin.lydsy.com/JudgeOnline/problem.php?id=2797 题目大意:给你几个串求出几个串中的最长公共子串. 题解:先看n最大才5,所以很容易 ...
- 笔记整理--玩转robots协议
玩转robots协议 -- 其他 -- IT技术博客大学习 -- 共学习 共进步! - Google Chrome (2013/7/14 20:24:07) 玩转robots协议 2013年2月8日北 ...
- 让VLC也拥有斷點播放功能
如何让VLC也拥有记忆功能,记住上次播放位置.以下都是在Windows系统下操作,其他 方法/步骤 下载 libsrpos_plugin-0.5.win 插件 https://sourceforge. ...
- php刷新当前页面
echo "<script language=JavaScript> location.replace(location.href);</script>"; ...
- jpg图片在开发板上显示
文件IO项目: 在开发板屏幕上循环显示目录里的图片 a.按照一定的间隔循环显示目录里的bmp图片 b.实现手指滑动来显示目录里的图片(bmp,jpg)上一张,下一张 d1: 1.能操控屏幕(查询开发板 ...
- redis sets类型及操作
sets类型及操作set是集合,它是string类型的无序集合.通过hash table实现,添加.删除.查找的复杂度都是0(1).对集合我们可以实现取交际.差集并集.通过这些操作我们可以实现SNS中 ...
- Mac bash rc
###################################### ########## .bashrc ###################################### cas ...