设计模式_3_建造者模式

建造者模式(BuilderPattern)

内在的核心问题就是: 使用多个简单对象根据一种组合关系构造一个我们想要的复杂对象, 属于创建型模式

  • 建造者模式的角色关系
    建造者模式中总共有两种角色:
1.建造者: 负责建造每个基本组件
2.指挥者: 将建造者建造好的基本组件按照某种组合关系进行拼装
  • 使用方式:
    建造者模式具有两部分组成: 基本组件( 维持在稳定状态,不会轻易变化 ), 基本组件之间的组合关系( 组合关系总是多变的 );
1.先将每个简单的组件类构建出来.
2.指挥者按照特定的建造顺序调用组件类对象
	举个例子: 比如电脑的组装, 组装顺序是固定的, 但是组装的零件是可变的
3.在测试类中通过指挥者对象选用需要的基本组件, 构造复杂对象

优点: 基本组件独立,易扩展; 便于控制细节风险
缺点: 构建出来的复杂对象必须有公共点, 构建的范围有限制; 生成对象之间具有一定的依赖关系

注: 建造者模式与工厂模式的区别-----建造者更关注零件的装配顺序, 将一个复杂的构建过程与其表示相分离, 并不是由建造者负责一切, 而是由指挥者负责控制(定义)一个复杂的构建过程, 由各个不同的建造者分别实现构建过程所用到的构建步骤

  • 下面通过一个例子说明:
    基本组件: 汉堡, 冷饮, 纸盒, 瓶子
package com.BuilderPattern;
import java.util.ArrayList;
import java.util.List;

/**
 * 快餐店案例, 套餐为汉堡,冷饮,包装有纸盒,瓶子
 * @author regotto
 *
 */
public class BuilderPattern {
	//测试类
	public static void main(String[] args) {
		MealBuilder mb=new MealBuilder();
		//测试类中负责需要的点餐内容
		Meal vegMeal=mb.prepareVegMeal(new VegBurger(), new Pepsi());
		vegMeal.showItems();
		System.out.println("Cost: "+vegMeal.getCost());
	}
}

//针对所有基本组件的接口: 名字,包装形式, 价格
interface Item{
	String name();
	Packing packing();
	double price();
}

//指挥者: 搭配一次点餐内容
class MealBuilder{
	//搭配方式是固定的, 汉堡+冷饮
	public Meal prepareVegMeal(Burger b, ColdDrink cd) {
		Meal meal=new Meal();
		meal.addItem(b);
		meal.addItem(cd);
		return meal;
	}
}

//一次点餐包含的基本组件(使用ArrayList存储)
class Meal{
	private List<Item> items=new ArrayList<Item>();
	public void addItem(Item item) {
		items.add(item);
	}
	public double getCost() {
		double cost=0.0;
		for(Item item:items) {
			cost+=item.price();
		}
		return cost;
	}
	public void showItems() {
		for(Item item:items) {
			System.out.print("Item: "+item.name());
			System.out.print(" , Packing: "+item.packing().pack());
			System.out.println(", Price: "+item.price());
		}
	}
}
//基本组件包装的接口: 包装,包含纸盒,瓶子
interface Packing{
	public String pack();
}

//包装的实现类, 汉堡使用纸盒, 冷饮使用瓶子
class Wrapper implements Packing{
	public String pack() {
		return "Wrapper";
	}
}
class Bottle implements Packing{
	public String pack() {
		return "Bollte";
	}
}

//抽象的汉堡组件
abstract class Burger implements Item{
	public Packing packing() {
		return new Wrapper();
	}
}
//汉堡组件的实现类
class VegBurger extends Burger{
	public String name() {
		return "VegBurger";
	}
	public double price() {
		return 10.5;
	}
}
class ChickenBurger extends Burger{
	public String name() {
		return "ChickenBurger";
	}
	public double price() {
		return 15.5;
	}
}

//抽象冷饮的基本组件
abstract class ColdDrink implements Item{
	public Packing packing() {
		return new Bottle();
	}
}
//冷饮的实现类
class Pepsi extends ColdDrink{
	public String name() {
		return "Pepsi";
	}
	public double price() {
		return 3.50;
	}
}
class Coke extends ColdDrink{
	public String name() {
		return "Coke";
	}
	public double price() {
		return 5.50;
	}
}

上面有错, 还请指出, 如果认为我写的还不错, 还请点个赞, 多多支持一下, O(∩_∩)O~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值