
设计模式-05.建造者模式(Builder Pattern)
需要构建不同时类型复杂对象 的情况,例如像软件开发中的配置文件生成或日志文件处理。 生成符合特定需求的对象,例如根据不同的参数或用户选择生成不同的界面布局或报告格式。 需要一步步构建具有依赖关系的对象,例如在移动应用中构建用户界面或在网络传输中逐步构建和发送数据。 类的独立性:Builder 类独立于其他对象,易于扩展和维护。 复合对象易管理:能够一步步构建复合对象,避免了需要显式管理对象的依赖关系。 灵活性高:支持不同的构建顺序和方式,适用于多种动态构建需求。 避免横向扩张:能够保证类之间的松耦合,便于使用不同的Builder 实现来创建不同的对象。
发布日期:2021-05-20 05:12:30
浏览次数:30
分类:精选文章
本文共 4326 字,大约阅读时间需要 14 分钟。
建造者模式(Builder Pattern)
建造者模式是一种创建型设计模式( Creational Design Pattern ),适用于需要将一个复杂对象分解成多个简单对象并一步步构建的场景。这种模式的核心思想是将构造复杂对象与其表示相分离,使得同一个构建过程能够生成不同类型的对象。
定义
建造者模式通过一个 Builder 类 向步骤式地构建最终对象。该 Builder 类独立于其他字面意思对象,负责将各个部分组合在一起,形成最终的复杂对象。
核心思想
建造者模式的关键在于将 不变的部分与变化的部分分离开。这使得容易扩展和修改复杂对象的构建过程,而不需要修改已有的组成部分。这种模式尤其适用于以下情况:
- 有些部分的组件是固定的,而它们的组合却经常变化。
- 需要生成多种不同的对象,但它们具有共同的构建过程。
主要适用场景
建造者模式常见于如下的场景:
实现步骤
步骤 1:定义接口
首先,定义需要构建的物品和包装接口。
public interface Item { String getName(); Packing getPacking(); float getPrice();}
public interface Packing { String getPack();}
步骤 2:实现包装接口
创建实现 Packing
接口的类。
public class Wrapper implements Packing { @Override public String getPack() { return "Wrapper"; }}
public class Bottle implements Packing { @Override public String getPack() { return "Bottle"; }}
步骤 3:创建可扩展的抽象类
创建实现 Item
接口的抽象类,确保每个具体的物品都能提供自己的包装和价格。
public abstract class Burger implements Item { @Override public Packing getPacking() { return new Wrapper(); } @Override public abstract float getPrice();}
public abstract class ColdDrink implements Item { @Override public Packing getPacking() { return new Bottle(); } @Override public abstract float getPrice();}
步骤 4:创建具体实现类
扩展 Burger
和 ColdDrink
接下来,创建具体实现类。
public class VegBurger extends Burger { @Override public float getPrice() { return 25.0f; } @Override public String getName() { return "Veg Burger"; }}
public class ChickenBurger extends Burger { @Override public float getPrice() { return 50.5f; } @Override public String getName() { return "Chicken Burger"; }}
public class Coke extends ColdDrink { @Override public float getPrice() { return 30.0f; } @Override public String getName() { return "Coke"; }}
public class Pepsi extends ColdDrink { @Override public float getPrice() { return 35.0f; } @Override public String getName() { return "Pepsi"; }}
步骤 5:创建 Meal 类
定义 Meal
类,里面存储需要构建的物品和能够显示或计算总成本的功能。
public class Meal { private List- items = new ArrayList<>(); public void addItem(Item item) { items.add(item); } public float getCost() { float sum = 0.0f; for (Item item : items) { sum += item.getPrice(); } return sum; } public void showItems() { for (Item item : items) { System.out.println("名称: " + item.getName()); System.out.println("包装: " + item.getpacking().getPack()); System.out.println("价格: " + item.getPrice()); System.out.println("----------------"); } }}
步骤 6:创建 MealBuilder 类
MealBuilder
类的作用是将单独的物品构建为完整的 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; }}
步骤 7:演示示例
使用 MealBuilder
类构建不同套餐的 Meal。
public class BuilderPatternDemo { public static void main(String[] args) { MealBuilder mealBuilder = new MealBuilder(); Meal vegMeal = mealBuilder.prepareVegMeal(); System.out.println("素食套餐:"); vegMeal.showItems(); System.out.println("总价格: " + vegMeal.getCost()); System.out.println("\n\n非素食套餐:"); Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); nonVegMeal.showItems(); System.out.println("总价格: " + nonVegMeal.getCost()); }}
运行输出
运行上述程序将会输出:
素食套餐:名称: Veg Burger包装: Wrapper价格: 25.0名称: Coke包装: Bottle价格: 30.0总价格: 55.0非素食套餐:名称: Chicken Burger包装: Wrapper价格: 50.5名称: Pepsi包装: Bottle价格: 35.0总价格: 85.5
优点分析
总结
建造者模式是一种非常有效的解决方案,适用于需要构建复杂对象但又希望保持代码结构清晰和可维护性的场景。通过将对象构建过程与对象表示分离开,可以独立地控制构建逻辑,提高代码的灵活性和扩展性。这也是为什么它被广泛应用于需要动态构建和组合不同组件的系统中。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年05月05日 17时55分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
49数据通路的功能和基本结构
2019-03-17
Java面试宝典(2020版)
2019-03-17
Springboot 初學習
2019-03-17
2020年云南省专升本 - 「计算机」专业各院校招生计划
2019-03-17
Android 四大组件、五大存储、六大布局总结
2019-03-17
【VRP问题】基于模拟退火改进遗传算法求解带时间窗含充电站的车辆路径规划问题EVRPTW
2019-03-17
打工族有房有车,原来是这么实现的
2019-03-17
算法 顺序查找/折半查找/冒泡排序/选择排序(待改)
2019-03-17
Rancher从入门到精通-2.0 配置gitlab代码库 404页面 原因有点扯
2019-03-17
ProgresSql 连接 ssl off 错误
2019-03-17
浏览器打开winscp 系统错误。代码:5。 拒绝访问。
2019-03-17
Oracle Listener动态注册与静态注册(转载)
2019-03-17
Kubernetes 无法查询到并且无法删除pod实例的排查过程
2019-03-17
android中button修改不了背景颜色
2019-03-17
uniapp自定义弹窗组件|仿微信android/ios弹窗效果
2019-03-17
(网络安全)主动信息收集 操作系统识别
2019-03-17
Class和ClassLoader的getResource方法对比
2019-03-17
redis教程-redis环境搭建安装(qq:1197852132)
2019-03-17