什么是建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
首先我们建立一个House对象
package com.meritit;
/**
* 房子
* @author 李小强
*
*/
public class House {
//地板
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.meritit;
/**
*
* @author 李小强
*
*/
public class MainClass {
public static void main(String[] args) {
//客户直接造房子
House house = new House();
house.setFloor("地板");
house.setHousetop("屋顶");
house.setWall("墙");
}
}
上面的这种方式实际上是让客户自己造房子,这显然不好,下面我们开始用建造者模式实现:
创建一个HouseBuilder接口
package com.meritit;
/**
* 造房子的接口
* @author 李小强
*
*/
public interface HouseBuilder {
//修地板
public void makeFloor();
//修墙
public void makeWall();
//修屋顶
public void makeHousetop();
//获得房子
public House getHouse();
}
用具体的造房子的工程实现
package com.meritit;
/**
* 平房工程队
* @author 李小强
*
*/
public class PingFangBuilder implements HouseBuilder{
House house = new House();
@Override
public void makeFloor() {
house.setFloor("平房地板");
}
@Override
public void makeWall() {
house.setWall("平房房顶");
}
@Override
public void makeHousetop() {
house.setHousetop("平房屋顶");
}
@Override
public House getHouse() {
return house;
}
}
现在这样造房子
package com.meritit;
/**
*
* @author 李小强
*
*/
public class MainClass {
public static void main(String[] args) {
//由工程队来修房子
HouseBuilder builder = new PingFangBuilder();
builder.makeFloor();
builder.makeHousetop();
builder.makeWall();
House house = builder.getHouse();
System.out.println(house.getFloor());
System.out.println(house.getHousetop());
System.out.println(house.getWall());
}
}
这里好像缺少一个专门建造房子的角色,下面我们这样做:
创建一个实际的建造者去造房子
package com.meritit;
/**
* 实际建造者
* @author 李小强
*
*/
public class HouseDicrector {
private HouseBuilder builder;
public HouseDicrector(HouseBuilder builder){
this.builder = builder;
}
/**
* 建造房子
*/
public void makeHouse(){
builder.makeFloor();
builder.makeHousetop();
builder.makeWall();
}
}
现在Main方法中就可以这样造房子了:
package com.meritit;
import javax.naming.directory.DirContext;
/**
*
* @author 李小强
*
*/
public class MainClass {
public static void main(String[] args) {
//设计房子
HouseBuilder builder = new PingFangBuilder();
//创造工程队
HouseDicrector dicrector = new HouseDicrector(builder);
//开始造
dicrector.makeHouse();
//得到房子
House house = builder.getHouse();
System.out.println(house.getFloor());
System.out.println(house.getHousetop());
System.out.println(house.getWall());
}
}
这就是建造者设计模式,如果现在你想建造公寓只需要先设计一个公寓就行。
设计公寓
package com.meritit;
/**
* 设计公寓
* @author 李小强
*
*/
public class GongyuBuilder implements HouseBuilder{
House house = new House();
@Override
public void makeFloor() {
house.setFloor("公寓地板");
}
@Override
public void makeWall() {
house.setWall("公寓墙");
}
@Override
public void makeHousetop() {
house.setHousetop("公寓房顶");
}
@Override
public House getHouse() {
return house;
}
}
在Main方法中只需将Pingfang平房改为Gongyu
package com.meritit;
import javax.naming.directory.DirContext;
/**
*
* @author 李小强
*
*/
public class MainClass {
public static void main(String[] args) {
//设计房子
HouseBuilder builder = new GongyuBuilder();
//创造工程队
HouseDicrector dicrector = new HouseDicrector(builder);
//开始造
dicrector.makeHouse();
//得到房子
House house = builder.getHouse();
System.out.println(house.getFloor());
System.out.println(house.getHousetop());
System.out.println(house.getWall());
}
}
我们还可以再改一下
package com.meritit;
/**
* 实际建造者
* @author 李小强
*
*/
public class HouseDicrector {
/**
* 建造房子
*/
public void makeHouse(HouseBuilder builder){
builder.makeFloor();
builder.makeHousetop();
builder.makeWall();
}
}
这样在Main方法中可以这样做:
package com.meritit;
import javax.naming.directory.DirContext;
/**
*
* @author 李小强
*
*/
public class MainClass {
public static void main(String[] args) {
//设计房子
HouseBuilder builder = new GongyuBuilder();
//创造工程队
HouseDicrector dicrector = new HouseDicrector();
//开始造
dicrector.makeHouse(builder);
//得到房子
House house = builder.getHouse();
System.out.println(house.getFloor());
System.out.println(house.getHousetop());
System.out.println(house.getWall());
}
}
建造者模式的结构如图:
建造者模式的应用场景:
-对象的创建:Builder模式是为对象的创建而设计的模式
- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
源代码下载:http://download.youkuaiyun.com/detail/lxq_xsyu/5956163