建造者模式

建造者模式

1.简介

1.1含义

建造者模式也可以属于创建形模式。它将对象的构造和它的表现分离,使得同样的构建过程可以创建不同的表示。它使用多个简单的对象一步一步构建成一个复杂的对象。通常,我们是用一个builder类来一步一步的去构建我们的对象的。 该 Builder 类是独立于其他对象的。

1.2优点

建造者模式可以在构建复杂对象的时候,比如持有数据的对象,或者内部数据需要以一定顺序加载的时候。让构建的过程透明,使用者运行很少的代码就能创建一个十分复杂的对象。

1.3原理

举个例子来说吧,好比说我们有家肯德基,肯德基里面有汉堡还有可乐,而汉堡有蔬菜汉堡和鸡肉汉堡,可乐有百事可乐和可口可乐,而我们的可乐是用瓶子包装的,汉堡是用包装纸包装的。而每一种汉堡和可乐有不同的价格。

顾客点餐不可能只点单独的一个汉堡或者可乐,并且不可能只点同一种,所以我们用一个菜单里面放不同的套餐来约束,当顾客点餐时候就直接点套餐,厨师,也就是建造者就可以根据不同的套餐来不同的流程去做菜品。

Product(产品角色):一个具体的产品对象。
Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类。
ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件。
Director(指挥者):构建一个使用Builder接口的对象。它主要用来创建一个负责的对象,有两个作用:一是隔离了客户和对象的生产过程;二是负责控制产品对象的生产过程。

2 代码举例

步骤 1

创建一个表示食物条目和食物包装的接口。

Item.java

public interface Item {   
	public String name();   
	public Packing packing();   
	public float price();     
	}

Packing.java

public interface Packing { 
	public String pack(); 
	}

步骤 2

创建实现 Packing 接口的实体类。

Wrapper.java

public class Wrapper implements Packing {
	@Override   
	public String pack() {      
	return "Wrapper";   
	}
}

Bottle.java

public class Bottle implements Packing { 
	@Override   
	public String pack() {
    return "Bottle";  
    	} 
    }

步骤 3

创建实现 Item 接口的抽象类,该类提供了默认的功能。

Burger.java

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

ColdDrink.java

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

步骤 4

创建扩展了 Burger 和 ColdDrink 的实体类。

VegBurger.java

public class VegBurger extends Burger { 
    @Override   
    public float price() {     
        return 25.0f;   
    }    
    @Override   
    public String name() {
        return "Veg Burger"; 
    } 
}

ChickenBurger.java

public class ChickenBurger extends Burger {  
    @Override  
    public float price() { 
        return 50.5f; 
    }    
    @Override  
    public String name() {   
        return "Chicken Burger";
    } 
}

Coke.java

public class Coke extends ColdDrink {  
    @Override  
    public float price() { 
        return 30.0f;   
    }    
    @Override   
    public String name() {  
        return "Coke"; 
    }
}


Pepsi.java

public class Pepsi extends ColdDrink {    
    @Override   
    public float price() {      
        return 35.0f;  
    }    
    @Override   
    public String name() {
        return "Pepsi";   
    } 
}

步骤 5

创建一个 Meal 类,带有上面定义的 Item 对象。

Meal.java

import java.util.ArrayList; 
import java.util.List;  
public class Meal {   
    private List<Item> items = new ArrayList<Item>();        
    public void addItem(Item item){
        items.add(item);   
    }   
    
    public float getCost(){     
        float cost = 0.0f;      
        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());    
        }          
    }   
}

步骤 6

创建一个 MealBuilder 类,实际的 builder 类负责创建 Meal 对象。

MealBuilder.java

public class MealBuilder {   
    public Meal prepareVegMeal (){      
        Meal meal = new Meal();     
        meal.addItem(new VegBurger());     
        meal.addItem(new Coke());      
        return meal;  
    }       
    public Meal prepareNonVegMeal (){      
        Meal meal = new Meal();      
        meal.addItem(new ChickenBurger());     
        meal.addItem(new Pepsi());      
        return meal;   } 
}

步骤 7

BuiderPatternDemo 使用 MealBuilder 来演示建造者模式(Builder Pattern)。

BuilderPatternDemo.java

public class BuilderPatternDemo { 
    public static void main(String[] args) {
        MealBuilder mealBuilder = new MealBuilder();       
        eal vegMeal = mealBuilder.prepareVegMeal();      
        System.out.println("Veg Meal");      
        vegMeal.showItems();      
        
        System.out.println("Total Cost: " +vegMeal.getCost());      
        Meal nonVegMeal = mealBuilder.prepareNonVegMeal();      					
        System.out.println("\n\nNon-Veg Meal");      nonVegMeal.showItems();      
        System.out.println("Total Cost: " +nonVegMeal.getCost());   
    }
}

步骤 8

执行程序,输出结果:

Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total Cost: 55.0


Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

末、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值