建造者模式

来源:互联网 发布:人工智能 传统制造业 编辑:程序博客网 时间:2024/06/14 01:40

建造者模式

 建造者模式 主要用于创建复杂的对象集合。由构建器一步一步构建出复杂的对象。
主要有三部分,复杂的对象,构造器,组合复杂对象的简单对象。
 采用快餐店的套餐来说事,需要生成一个套餐,那么里面有汉堡和饮料,以及其它小吃,不同的套餐会存在不同的组合,这里只是以汉堡和饮料的组合来构造套餐,有蔬菜汉堡套餐,鸡肉汉堡套餐。
首先所有的套餐内的食品都需要放在一个套餐的组合(容器)内,那么他们就需要共同的特性方便有一个统一的容器来保存他们,所有的食物特性都有,包装、名称、价格。那么封装一个食物的接口(依赖倒转)
public interface Item {String name();float price();Packing packing();}
在此基础上分类食物为饮料喝汉堡分别创建他们的抽象类

public abstract class Burger implements Item{//汉堡抽象类@Overridepublic Packing packing() {return new Wrapper();}}

public abstract class ColdDrink implements Item{//饮料抽象类@Overridepublic Packing packing() {// TODO Auto-generated method stubreturn new Bottle();}}

上面出现了两个未知类Wrapper喝Bottle,它们分别代表了不同的包装方式,为了使用它们组合复杂的对象,它们也需要在任何地方能用父类指向子类对象。抽象

public interface Packing {String pack();}
分别实现不同的包装Wrapper和Bottle

public class Bottle implements Packing{@Overridepublic String pack() {// TODO Auto-generated method stubreturn "Bottle";}}

public class Wrapper implements Packing{

@Override

public String pack() {

// TODO Auto-generated method stub

return "Wrapper";

}


}


有了包装那么就剩下具体摸一个食物的名称及价格

public class ChickenBurger extends Burger{


@Override

public String name() {

// TODO Auto-generated method stub

return"Chicken Burger";

}

@Override

publicfloat price() {

// TODO Auto-generated method stub

return 25.6f;

}

}

public class VegBurger extends Burger{


@Override

public String name() {

// TODO Auto-generated method stub

return "VegBurger";

}

@Override

public float price() {

// TODO Auto-generated method stub

return 15.3f;

}

}

public class Coke extends ColdDrink{


@Override

public String name() {

// TODO Auto-generated method stub

return "coke";

}

@Override

public float price() {

// TODO Auto-generated method stub

return 3f;

}

}


public class Orange extends ColdDrink{


@Override

public String name() {

// TODO Auto-generated method stub

return "Oragne";

}

@Override

public float price() {

// TODO Auto-generated method stub

return 4.5f;

}

}



现在具体的食物类已经创建完毕,那么就需要放他们的容器(套餐类)

public class Meal {


private List<Item>items = new ArrayList<Item>();

publicvoid addItem(Item item){

items.add(item);

}

publicfloat getCost(){

floattotalCost = 0;

for(Itemitem : items){

totalCost+=item.price();

}

returntotalCost;

}

publicvoid showItems(){

for (Itemitem : items) {

System.out.print("Name:"+item.name()+"\t");

System.out.print("Packing:"+item.packing().pack()+"\t");

System.out.println("Price:"+item.price());

}

}

}


接下来那么就需要构造套餐了,需要构造器

public class MealBuilder1 {


Meal meal =new Meal();

public Meal create(){

returnmeal;

}

public MealBuilder1 addBurger(Burgerburger){

meal.addItem(burger);

returnthis;

}

public MealBuilder1 addColdDrink(ColdDrinkcoldDrink){

meal.addItem(coldDrink);

returnthis;

}

}


使用构造器生产套餐

public static void main(String[] args){

MealBuilder1 builder1 = new MealBuilder1();

Meal vegMeal =builder1.addBurger(new VegBurger()).addColdDrink(new Orange()).create();

vegMeal.showItems();

System.out.println("Totlal Price:"+vegMeal.getCost());

MealBuilder1 builder2 = new MealBuilder1();

Meal chickenMeal =builder2.addBurger(new ChickenBurger()).addColdDrink(new Coke()).create();

chickenMeal.showItems();

System.out.println("Total Price:"+chickenMeal.getCost());

}

UML图就不上传了,有兴趣可以去菜鸟教程看看
总结:建造者模式就是利用建造器不断地给最终的产品不断添加不同的新对象,但是这些子对象需要有相同的特性以便于减少最终对象中的子类型对象定义。

原创粉丝点击