Java设计模式--建造者模式

一、简介

1.1 模式定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属性对象创建型模式。建造者模式又可称为生成器模式。

1.2 适用场景

在以下情况下可以使用建造者模式:
1)需要生成的产品对象由复杂的内部结构,这些产品对象通常包含多个成员属性。
2)需要生成的产品对象的属性相互依赖,需要知道其生成顺序。
3)对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
4)隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

1.3 优点

1)在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
2)每一个具体建造者都相对独立。与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
3)可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
4)增加新的具体建造者无须修改原有类库代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。

1.4 缺点

1)建造者模式所创建的产品一般具有较多的共同点,其组成部分相似。如果产品之间差异性很大,则不适合建造者模式,因此其使用范围受到一定的限制。
2)如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

二、示例

2.1 结构图

在这里插入图片描述

2.2 产品类Meal
public class Meal {

	// food和drink是部件
	private String food;
	private String drink;
	public String getFood() {
		return food;
	}
	public void setFood(String food) {
		this.food = food;
	}
	public String getDrink() {
		return drink;
	}
	public void setDrink(String drink) {
		this.drink = drink;
	}
	
}
2.3 抽象建造类MealBuilder
public abstract class MealBuilder {

	protected Meal meal = new Meal();
	
	public abstract void buildFood();
	
	public abstract void buildDrink();
	
	public Meal getMeal() {
		return meal;
	}
}
2.4 具体建造者类SubMealBuilderA

public class SubMealBuilderA extends MealBuilder{

	@Override
	public void buildFood() {
		meal.setFood("一个鸡腿堡");
	}

	@Override
	public void buildDrink() {
		meal.setDrink("一杯可乐");
	}

}
2.5 具体建造者类SubMealBuilderB
public class SubMealBuilderB extends MealBuilder{

	@Override
	public void buildFood() {
		meal.setFood("一个鸡肉卷");
	}

	@Override
	public void buildDrink() {
		meal.setDrink("一杯果汁");
	}

}
2.6 指挥着类KFCWaiter
public class KFCWaiter {
	
	private MealBuilder mb;
	
	public void setMealBuilder(MealBuilder mb) {
		this.mb = mb;
	}
	
	public Meal construct() {
		mb.buildFood();
		mb.buildDrink();
		return mb.getMeal();
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值