设计模式14:建造者模式

109 阅读3分钟

建造者模式

1.建房子问题

(1) 问题
  • 建房子的过程:打桩、砌墙、封顶。
  • 建的房子有这种各样的,比如普通房、高楼、别墅,虽然他们的过程是一样的,但是要求各不相同。
(2) 传统方法实现

在这里插入图片描述

/** 房子抽象类 **/
public abstract class AbstractHouse{
	// 打地基
	public abstract void buildBasic();
	// 砌墙
	public abstract void buildWall();
	// 封顶
	public abstract void roofed();

	// 建房子,其中具体的各个步骤的内容子类会实现。
	public void build(){
		buildBasic();
		buildWall();
		roofed();
	}
}

/** 普通房子类 **/
public class CommonHouse extends AbstractHouse{
	@Override
	public void buildBasic(){ sout("普通房子打地基中..."); }
	
	@Override
	public void buildWall(){ sout("普通房子砌墙中..."); }

	@Override
	public void roofed(){ sout("普通房子封顶中..."); }
}

/** 使用 **/
public class doBuild(){
	psvm(){
		CommonHouse common = new CommonHous();
		common.build();
	}
}
(3) 优缺点
  • 优点:简单易操作
  • 缺点:设计的程序结构,过于简单,没有设计缓存层对象,程序的拓展性和维护性不好。这种设计方案,把产品(房子)和创建产品的过程(建房子)封装在一起,耦合性增强了。
  • 将产品和产品建造的过程解耦 => 建造者模式

2.建造者模式

(1) 基本介绍
  • 建造者模式,又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来,是这个抽象过程的不同实现方式可以构造出不同表现(属性)的对象。
  • 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
(2) 建造者模式的四个角色
  • Product(产品角色) :一个具体的产品对象。
  • Builder(抽象建造者) :创建一个Product对象的各个部件指定的接口或抽象类。主要负责描述、指定Product的建造各个步骤,但是具体的建造内部不需要实现。(注意这个角色不指定建造流程,流程由指挥者负责)
  • ConcreteBuilder(具体建造者) :继承、实现抽象建造者,具体实现建造Product的各个部件。
  • Director(指挥者) :构建一个使用Builder接口/抽象类的对象。控制产品对象的生产过程。
    在这里插入图片描述
(3) 用建造者模式实现建房子

在这里插入图片描述

/** 房子类 => 产品 **/
public class House{
	private String basic;	// 地基
	private String wall;	// 墙
	private String roofed;	// 屋顶

	getter&setter();
}

/** 房子建造抽象类 => 抽象建造者 **/
public abstract class HouseBuilder{
	private House house = new House();
		
	public abstract void buildBasic();	// 打地基
	public abstract void buildWall();	// 砌墙
	public abstract void roofed();	// 封顶

	public House getResult(){
		return house;
	}
}

/** 普通房子类 => 具体建造者 **/
public class CommonHouse extends AbstractHouse{
	@Override
	public void buildBasic(){ 
		house.setBasic("地基5米");
		sout("普通房子打地基中..."); 
	}
	
	@Override
	public void buildWall(){ 
		house.setWall("墙10厘米");
		sout("普通房子砌墙中..."); 
	}

	@Override
	public void roofed(){ 
		house.setRoofed("屋顶10厘米");
		sout("普通房子封顶中..."); 
	}
}

/** 建造房子类 => 指挥者 **/
public class HouseDirector{
	private HouseBuilder houseBuilder;
	
	// 通过构造器将HouseBuilder聚合进来,通过Setter方法也行。
	public HouseDirector(HouseBuilder houseBuilder){
		this.houseBuilder = houseBuilder;
	}

	// 如何建造房子,这个流程由指挥者在这里处理
	public House doBuild(){
		houseBuilder.houseBuilder();
		houseBuilder.buildWall();
		houseBuilder.roofed();
		
		return houseBuilder.getResult();
	}
}

// 使用
public class Do{
	psvm(){
		// 盖普通房子
		CommonHouse commonHouse = new CommonHouse();
		// 初始化指挥者
		HouseDirector doretor = new HouseDirector(commonHouse );
		House house = doretor.doBuild();
	}
}