企业内网 网站建设的解决方案,遵义网约车平台哪家好,网页制作策划路程,WordPress与前端文章目录 设计模式概述1、建造者模式2、建造者模式使用场景3、优点4、缺点5、主要角色6、代码示例#xff1a;1#xff09;实现要求2#xff09;UML图3)实现步骤#xff1a;1#xff09;创建一个表示食物条目和食物包装的接口2#xff09;创建实现Packing接口的实体类31实现要求2UML图3)实现步骤1创建一个表示食物条目和食物包装的接口2创建实现Packing接口的实体类3创建实现 Item 接口的抽象类该类提供了默认的功能4创建扩展了 Burger 和 ColdDrink 的实体类5创建一个Meal类带有上面定义的Item对象6创建一个MealBuilder类实际的builder类负责创建Meal对象7BuilderPatternDemo使用MealBuilder来演示建造者模式(Builder Pattern)8执行程序输出结果 7、总结 设计模式概述
创建型模式工厂方法、抽象方法、建造者、原型、单例。 结构型模式有适配器、桥接、组合、装饰器、外观、享元、代理。 行为型模式有责任链、命令、解释器、迭代器、中介、备忘录、观察者、状态、策略、模板方法、访问者。 常用设计模式 单例模式、工厂模式、代理模式、策略模式模板模式、门面模式、责任链模式、装饰器模式、组合模式、builder模式。
1、建造者模式
建造者模式是一种创建型设计模式它允许你创建复杂对象的步骤与表示方式相分离从而可以创建具有不同表示形式的对象。旨在通过逐步构造复杂对象的各个部分来简化对象的创建。它与工厂模式的不同之处在于建造者模式更注重将一个复杂对象的构造过程进行拆解并且可以根据需求一步步定制地构建。
2、建造者模式使用场景
构造函数包含多个参数或嵌套对象且顺序不固定的对象创建例如像 Pizza 这样可以自定义不同配料的场景建造者模式可以让我们有选择性地添加不同的部分而不需要冗长的构造函数。需要可读性强的对象创建代码对于那些复杂对象建造者模式可以让代码更加清晰。对象的不可变性Immutable Object通过建造者模式我们可以有效创建不可变对象对象一旦创建就不可更改这有助于避免线程安全问题。
3、优点
灵活性高可以根据不同需求构建不同的对象版本。代码清晰由于建造者模式将对象的创建与表示分开构建过程变得更加可读和维护。避免了构造函数过载当构造函数包含过多参数时使用建造者模式可以避免参数爆炸问题。
4、缺点
可能增加代码复杂度在某些场景下如果对象并不复杂使用建造者模式可能导致不必要的代码冗余。需要额外的Builder类每个复杂对象都需要有一个对应的Builder类可能会增加代码量。
5、主要角色
建造者模式包含以下几个主要角色
产品Product要构建的复杂对象。产品类通常包含多个部分或属性。抽象建造者Builder定义了构建产品的抽象接口包括构建产品的各个部分的方法。具体建造者Concrete Builder实现抽象建造者接口具体确定如何构建产品的各个部分并负责返回最终构建的产品。指导者Director负责调用建造者的方法来构建产品指导者并不了解具体的构建过程只关心产品的构建顺序和方式。
6、代码示例
1实现要求 我们假设一个快餐店的商业案例其中一个典型的套餐可以是一个汉堡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。
2UML图 3)实现步骤
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 {Overridepublic String pack() {return Wrapper;}
}// 瓶装 Bottle.java
public class Bottle implements Packing {Overridepublic String pack() {return Bottle;}
}3创建实现 Item 接口的抽象类该类提供了默认的功能
public abstract class Burger implements Item {Overridepublic Packing packing() {return new Wrapper();}Overridepublic abstract float price();
}
public abstract class ColdDrink implements Item {Overridepublic Packing packing() {return new Bottle();}Overridepublic abstract float price();
}
4创建扩展了 Burger 和 ColdDrink 的实体类
public class VegBurger extends Burger {Overridepublic float price() {return 25.0f;}Overridepublic String name() {return Veg Burger;}
}public class ChickenBurger extends Burger {Overridepublic float price() {return 50.5f;}Overridepublic String name() {return Chicken Burger;}
}// Coke 类继承 ColdDrink
public class Coke extends ColdDrink {Overridepublic float price() {return 30.0f;}Overridepublic String name() {return Coke;}
} // Pepsi 类继承 ColdDrink
public class Pepsi extends ColdDrink {Overridepublic float price() {return 35.0f;}Overridepublic String name() {return Pepsi;}
}5创建一个Meal类带有上面定义的Item对象
import java.util.ArrayList;
import java.util.List;public class Meal {private ListItem items new ArrayListItem(); 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对象
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;}
}7BuilderPatternDemo使用MealBuilder来演示建造者模式(Builder Pattern)
public class BuilderPatternDemo {public static void main(String[] args) {MealBuilder mealBuilder new MealBuilder();Meal 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.0Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5
7、总结
建造者模式提供了一种优雅的方式来创建复杂的对象特别适合在需要精细控制对象构建过程的场景下使用。通过分离构建过程和对象本身它可以使代码更加简洁、可读且易于维护。尽管它有时会增加代码的复杂度但在应对复杂对象创建时这种模式非常值得推荐。