设计模式学习笔记06 - Java版之建造者模式

1. 盖房子

  1. 建房子: 打桩 砌墙 封顶
  2. 房子很多种: 普通 高楼 别墅

2. 传统方式

2.1 UML图

在这里插入图片描述

2.2 代码实现

package com.liyang;

public abstract class AbstractHouse {
	// 打地基
	public abstract void buildBasic();

	// 砌墙
	public abstract void builsWalls();

	// 封顶
	public abstract void roofed();

	// 再加一个方法将上面的方法按照顺序组装在一起
	public void build() {
		buildBasic();
		builsWalls();
		roofed();
	}
}
package com.liyang;

public class HighBuilding extends AbstractHouse {

	@Override
	public void buildBasic() {
		System.out.println("高楼打地基...");
	}

	@Override
	public void builsWalls() {
		System.out.println("高楼砌墙...");
	}

	@Override
	public void roofed() {
		System.out.println("高楼封顶...");
	}
	
}
package com.liyang;

public class Client {

	public static void main(String[] args) {
		HighBuilding highBuilding = new HighBuilding();
		highBuilding.build();
	}

}

2.3 分析

优点: 简单
缺点: 过于简单, 没有设计缓存层, 程序扩展维护性不好. 也就是说这种方案把产品(房子) 和 创建产品的过程(建房子流程) 封装在一起, 耦合性增强
解决: 建造者模式

3. 建造者模式

3.1 基本介绍

  1. 建造者模式 又叫生成器模式, 是一种对象构建模式. 它可以将复杂对象的建造过程抽象出来(抽象类别), 使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象
  2. 建造者模式 是一步一步创建一个复杂的对象, 它允许用户只通过指定复杂对象的类型和内容就可以构建它们, 用户不需要知道内部具体的构建细节

3.2 四个角色

  1. Pruduct 产品角色: 一个具体的产品对象
  2. Builder 抽象建造者: 创建一个Product对象的各个部件指定的接口
  3. ConcreteBuilder 具体建造者: 实现接口, 构建和装配各个部件
  4. Director 指挥者: 构建一个使用Builder接口的对象. 它主要用于创建一个复杂的对象, 两个作用: 隔离了客户和对象的生产过程 负责控制产品对象的生产过程

在这里插入图片描述

3.3 案例应用

在这里插入图片描述

package com.liyang;

// 1. 产品
public class House {
	private String baise; // 地基
	private String wall; // 墙
	private String roofed; // 天花板

	public String getBaise() {
		return baise;
	}

	public void setBaise(String baise) {
		this.baise = baise;
	}

	public String getWall() {
		return wall;
	}

	public void setWall(String wall) {
		this.wall = wall;
	}

	public String getRoofed() {
		return roofed;
	}

	public void setRoofed(String roofed) {
		this.roofed = roofed;
	}

}
package com.liyang;

// 2. 抽象的建造者
public abstract class HouseBuilder {
	protected House house = new House();

	// 建造的流程
	public abstract void buildBasic();

	public abstract void buildWall();

	public abstract void roofed();
	
	// 建造房子
	public House buildHouse() {
		return house;
	}
}
package com.liyang;

// 3. 实现
public class CommonHouse extends HouseBuilder {

	@Override
	public void buildBasic() {
		System.out.println("普通房子打地基...");
	}

	@Override
	public void buildWall() {
		System.out.println("普通房子砌墙...");
	}

	@Override
	public void roofed() {
		System.out.println("普通房子吊顶...");
	}

}
package com.liyang;

public class HighBuilding extends HouseBuilder {

	@Override
	public void buildBasic() {
		System.out.println("高楼打地基...");
	}

	@Override
	public void buildWall() {
		System.out.println("高楼砌墙...");
	}

	@Override
	public void roofed() {
		System.out.println("高楼吊顶...");
	}

}
package com.liyang;

// 4. 指挥者
public class HouseDirector {
	HouseBuilder houseBuilder = null;

	// 构造器传入
	public HouseDirector(HouseBuilder houseBuilder) {
		super();
		this.houseBuilder = houseBuilder;
	}

	// set方式传入
	public void setHouseBuilder(HouseBuilder houseBuilder) {
		this.houseBuilder = houseBuilder;
	}

	// 如何建造房子交给指挥者
	public House buildHouse() {
		houseBuilder.buildBasic();
		houseBuilder.buildWall();
		houseBuilder.roofed();
		return houseBuilder.buildHouse();
	}
}
package com.liyang;

public class Client {

	public static void main(String[] args) {
		CommonHouse commonHouse = new CommonHouse();
		HouseDirector houseDirector = new HouseDirector(commonHouse);
		houseDirector.buildHouse();
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值