建造者模式

建造者模式:

一个Builder类一步一步构造最终对象,该Builder类是独立于其他对象的。

介绍

意图:

将一个复杂的构建与其表示相分离,使不同的构建过程可以创建不同的表示。

何时使用:

  • 一些基本的组件不变,组合经常改变

关键代码:

  • 建造者:创建和提供实例
  • 导演:管理创建出来实例的关系

优点:

  • 建造者独立,易于扩展。
  • 便于控制细节风险。

缺点:
1、产品必须有相同点,范围有限制
2、如果产品内部变化复杂,会有很多的构建类
还可在拆分(监工 抽象工厂)

使用

// 工厂
package cn.domin.design.builder;

import cn.domin.design.builder.food.ChickenBurger;
import cn.domin.design.builder.food.Item;
import cn.domin.design.builder.food.VegBurger;

/**
 * 建造工厂
 * @author 98543
 */
public class BuilderFactory {

	
	/**
	 * 套餐一
	 * @return
	 */
	public static Meau getMealOne() {
		Meau meau = new Meau();
		Item item = new VegBurger();
		meau.addItem(item);
		return meau;
	}
	
	/**
	 * 套餐二
	 * @return
	 */
	public static Meau getMealTwo() {
		Meau meau = new Meau();
		Item item = new ChickenBurger();
		meau.addItem(item);
		return meau;
	}
}
// 菜单
package cn.domin.design.builder;

import java.util.ArrayList;
import java.util.List;

import cn.domin.design.builder.food.Item;

public class Meau {
	
	private List<Item> foods = new ArrayList<Item>();
	
	public void addItem(Item item) {
		foods.add(item);
	}
	
	public float getCoustom() {
		float sum = 0.0f;
		for (Item food:foods) {
			sum += food.price();
		}
		return sum;
	}
	
	public void getMeauInfo() {
		for (Item food:foods) {
			System.out.println("菜单详情:");
			System.out.print("item -> "+food.name()+",price ->"+",packing -> "+food.packing().name());
		}
	}

}

// 食物接口
package cn.domin.design.builder.food;

import cn.domin.design.builder.packing.Packing;

/**
 *     食品接口
 * @author 98543
 */
public interface Item {
	
	public String name();
	public float price();
	public Packing packing();

}

// 抽象类
package cn.domin.design.builder.food;

import cn.domin.design.builder.packing.Bottle;
import cn.domin.design.builder.packing.Packing;

public abstract class Burger implements Item{
	
	@Override
	public Packing packing() {
		return new Bottle();
	}

}

package cn.domin.design.builder.food;

import cn.domin.design.builder.packing.Packing;
import cn.domin.design.builder.packing.Wrapper;

public abstract class ColdDrink implements Item{
	
	@Override
	public Packing packing() {
		return new Wrapper();
	}

}

// 具体实现
package cn.domin.design.builder.food;

/**
 * 鸡肉汉堡
 * @author 98543
 */
public class ChickenBurger extends Burger{

	@Override
	public String name() {
		return "鸡肉汉堡";
	}
	
	@Override
	public float price() {
		return 99;
	}
	
}

package cn.domin.design.builder.food;

/**
 * 椰汁
 * @author 98543
 */
public class Coke extends ColdDrink{

	@Override
	public String name() {
		return "椰汁";
	}
	
	@Override
	public float price() {
		return 10;
	}
}


posted @ 2019-09-05 17:14  kungFuPander  阅读(80)  评论(0编辑  收藏  举报