设计模式-建造者模式

About 3 minpattermjava builder

一、对建造者模式的理解

就是将多个简单的对象一步一步构建为一个复杂的对象。主要解决软件开发中的一个复杂对象的创建。代码就实现汉堡和饮料的点餐功能。 我们创建包装接口,由瓶子装饮料,包装纸包装汉堡的实现类去实现包装接口。在创建一个项目接口,由汉堡和冷饮的抽象类去实现,之后创建各自的实现类去实现,汉堡有蔬菜汉堡和鸡肉汉堡,冷饮后百事可乐和可口可乐。在然后创建用餐的类采用list存放项目。最后创建一个用餐建造类来建造蔬菜餐和非蔬菜餐。

二、代码实现

创建包装接口和各自的实现类

package study.builder;
// 装食物的填料接口
public interface Packing {
	public String pack();  // 大包
}

// 包装纸材料
class Wrapper implements Packing{
	@Override
	public String pack() {
		return "包装材料";
	}
}
// 瓶子包装
class Bottle implements Packing{
	@Override
	public String pack() {
		return "瓶子包装";
	}
	
}

创建项目接口,汉堡、冷饮接口以及各自的实现类

// 项目接口
public interface Item {
	public String name();
	public Packing packing();
	public float price();
}
// 汉堡使用包装纸包装抽象类
abstract class Burger implements Item{
	public Packing packing(){
		return new Wrapper();
	};
	public abstract float price(); 
}
// 冷饮抽象类
abstract class ColdDrink implements Item{
	public Packing packing() {
		return new Bottle();
	}
	public abstract float price();
}
// 蔬菜汉堡
class VegBurger extends Burger{
	@Override
	public String name() {
		return "蔬菜汉堡";
	}
	@Override
	public float price() {
		return 18.8f;
	}
}
// 鸡肉汉堡
class ChickenBurger extends Burger{
	@Override
	public String name() {
		return "鸡肉汉堡";
	}
	@Override
	public float price() {
		return 28.8f;
	}
}
// 可口可乐
class Coke extends ColdDrink{
	@Override
	public String name() {
		return "可口可乐";
	}
	@Override
	public float price() {
		return 5.5f;
	}
}
// 百事可乐
class Pepsi extends ColdDrink{
	@Override
	public String name() {
		return "百事可乐";
	}
	@Override
	public float price() {
		return 5.6f;
	}
}

创建用餐类

// 餐
public class Meal {
	private List<Item> items = new ArrayList<Item>();
	public void add(Item it ){
		this.items.add(it);
	}
	public float getCost() {
		float cost = 0.0f;
		for(Item it : items) {
			cost += it.price();
		}
		return cost;
	}
	public void showItem(){
		for(Item it : items) {
			System.out.print("项目:"+it.name());
			System.out.print(", " +it.packing().pack());
			System.out.println(", 价格" + it.price());
		}
	}
}

创建构造餐类

// 建造餐
public class MealBuilder {
	// 准备蔬菜餐
	public Meal prepareVegMeal() {
		Meal meal =  new Meal();
		meal.add(new VegBurger());
		meal.add(new Coke());
		return meal;
	}
	public Meal prepareNonVegMeal() {
		Meal meal = new Meal();
		meal.add(new ChickenBurger());
		meal.add(new Pepsi());
		return meal;
	}
}

main方法实现

public static void main(String[] args) {
		MealBuilder mb = new MealBuilder();
		Meal vegMeal = mb.prepareVegMeal();
		vegMeal.showItem();
		System.out.println("蔬菜餐的总价:"+ vegMeal.getCost());
		
		Meal nonvegMeal = mb.prepareNonVegMeal();
		nonvegMeal.showItem();
		System.out.println("肉类餐的总价:"+ nonvegMeal.getCost());
	}
	

运行结果

项目:蔬菜汉堡, 包装材料, 价格18.8
项目:可口可乐, 瓶子包装, 价格5.5
蔬菜餐的总价:24.3
项目:鸡肉汉堡, 包装材料, 价格28.8
项目:百事可乐, 瓶子包装, 价格5.6
肉类餐的总价:34.399998

三、 UML类图

builder

四、 笔记

定义: 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

github源码:https://github.com/gaoqisen/java-patternopen in new window

Last update:
Contributors: gaoqisen