设计模式之建造者模式详解(定义、优缺点、应用场景、实例类图)
时间:2024-12-09 来源:互联网 标签: PHP教程
建造者模式是一种创建型设计模式,它允许你创建复杂对象的步骤与表示方式相分离。建造者模式是一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程与其表示相分离,从而可以创建具有不同表示形式的对象。与工厂模式的区别是:建造者模式更加关注于零件装配的顺序。
一、建造者模式的概要
意图
将一个复杂的构建过程与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决
在软件系统中,一个复杂对象的创建通常由多个部分组成,这些部分的组合经常变化,但组合的算法相对稳定。
何时使用
当一些基本部件不变,而其组合经常变化时。
如何解决
将变与不变的部分分离开。
关键代码
建造者:创建并提供实例。
导演:管理建造出来的实例的依赖关系和控制构建过程。
结构
建造者模式包含以下几个主要角色:
产品(Product):要构建的复杂对象。产品类通常包含多个部分或属性。
抽象建造者(Builder):定义了构建产品的抽象接口,包括构建产品的各个部分的方法。
具体建造者(Concrete Builder):实现抽象建造者接口,具体确定如何构建产品的各个部分,并负责返回最终构建的产品。
指导者(Director):负责调用建造者的方法来构建产品,指导者并不了解具体的构建过程,只关心产品的构建顺序和方式。
应用实例
去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出不同的"套餐"。
Java 中的 StringBuilder。
二、建造者模式的使用场景
需要生成的对象具有复杂的内部结构。
需要生成的对象内部属性相互依赖。
三、建造者模式的优缺点
优点
分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
可以更好地控制构建过程,隐藏具体构建细节。
代码复用性高,可以在不同的构建过程中重复使用相同的建造者。
缺点
如果产品的属性较少,建造者模式可能会导致代码冗余。
增加了系统的类和对象数量。
四、建造者模式的实现
我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。
我们将创建一个表示食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。
然后我们创建一个 Meal 类,带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilder。BuilderPatternDemo 类使用 MealBuilder 来创建一个 Meal。
步骤 1:创建一个表示食物条目和食物包装的接口。
Item.java
publicinterfaceItem{
publicStringname();
publicPackingpacking();
publicfloatprice();
}
Packing.java
publicinterfacePacking{
publicStringpack();
}
步骤 2:创建实现 Packing 接口的实体类。
Wrapper.java
publicclassWrapperimplementsPacking{
@Override
publicStringpack(){
return"Wrapper";
}
}
Bottle.java
publicclassBottleimplementsPacking{
@Override
publicStringpack(){
return"Bottle";
}
}
步骤 3:创建实现 Item 接口的抽象类,该类提供了默认的功能。
Burger.java
publicabstractclassBurgerimplementsItem{
@Override
publicPackingpacking(){
returnnewWrapper();
}
@Override
publicabstractfloatprice();
}
ColdDrink.java
publicabstractclassColdDrinkimplementsItem{
@Override
publicPackingpacking(){
returnnewBottle();
}
@Override
publicabstractfloatprice();
}
步骤 4:创建扩展了 Burger 和 ColdDrink 的实体类。
VegBurger.java
publicclassVegBurgerextendsBurger{
@Override
publicfloatprice(){
return25.0f;
}
@Override
publicStringname(){
return"VegBurger";
}
}
ChickenBurger.java
publicclassChickenBurgerextendsBurger{
@Override
publicfloatprice(){
return50.5f;
}
@Override
publicStringname(){
return"ChickenBurger";
}
}
Coke.java
publicclassCokeextendsColdDrink{
@Override
publicfloatprice(){
return30.0f;
}
@Override
publicStringname(){
return"Coke";
}
}
Pepsi.java
publicclassPepsiextendsColdDrink{
@Override
publicfloatprice(){
return35.0f;
}
@Override
publicStringname(){
return"Pepsi";
}
}
步骤 5:创建一个 Meal 类,带有上面定义的 Item 对象。
Meal.java
importjava.util.ArrayList;
importjava.util.List;
publicclassMeal{
privateList<Item>items=newArrayList<Item>();
publicvoidaddItem(Itemitem){
items.add(item);
}
publicfloatgetCost(){
floatcost=0.0f;
for(Itemitem:items){
cost+=item.price();
}
returncost;
}
publicvoidshowItems(){
for(Itemitem: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
publicclassMealBuilder{
publicMealprepareVegMeal(){
Mealmeal=newMeal();
meal.addItem(newVegBurger());
meal.addItem(newCoke());
returnmeal;
}
publicMealprepareNonVegMeal(){
Mealmeal=newMeal();
meal.addItem(newChickenBurger());
meal.addItem(newPepsi());
returnmeal;
}
}
步骤 7:BuiderPatternDemo 使用 MealBuilder 来演示建造者模式(Builder Pattern)。
BuilderPatternDemo.java
publicclassBuilderPatternDemo{
publicstaticvoidmain(String[]args){
MealBuildermealBuilder=newMealBuilder();
MealvegMeal=mealBuilder.prepareVegMeal();
System.out.println("VegMeal");
vegMeal.showItems();
System.out.println("TotalCost:"+vegMeal.getCost());
MealnonVegMeal=mealBuilder.prepareNonVegMeal();
System.out.println("\n\nNon-VegMeal");
nonVegMeal.showItems();
System.out.println("TotalCost:"+nonVegMeal.getCost());
}
}
步骤 8:执行程序,输出结果:
VegMeal
Item:VegBurger,Packing:Wrapper,Price:25.0
Item:Coke,Packing:Bottle,Price:30.0
TotalCost:55.0
Non-VegMeal
Item:ChickenBurger,Packing:Wrapper,Price:50.5
Item:Pepsi,Packing:Bottle,Price:35.0
TotalCost:85.5
以上就是php小编整理的全部内容,希望对您有所帮助,更多相关资料请查看php教程栏目。
-
永劫无间多少钱一个红 2024-12-20
-
永劫无间多少钱开一个箱子 2024-12-20
-
阿瑞斯病毒2火铳弹药怎么获得?阿瑞斯病毒2火铳弹药获得方法 2024-12-19
-
阿瑞斯病毒2哈士奇在哪?阿瑞斯病毒2哈士奇获得方法 2024-12-19
-
寻道大千反击流阵容推荐 2024-12-19
-
和平精英性别怎么换?和平精英性别转换方法 2024-12-19