建造者模式
建造者模式:
一个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;
}
}