设计模式——建造者模式


什么是建造者模式

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.csdn.net/detail/lxq_xsyu/5956163

原文地址:https://www.cnblogs.com/pangblog/p/3263216.html