找回密码
 立即注册
首页 业界区 业界 建造者模式(Builder Pattern)

建造者模式(Builder Pattern)

阎怀慕 2025-6-6 09:46:48
建造者模式

一、模式动机

建造者模式(Builder Pattern)是最复杂的创建型模式,它用于创建一个包含多个组成部分的复杂对象,可以返回一个完整的产品对象给用户。它通过将客户端与包含多个组成部分的复杂对象的创建过程分离,使得客户端无需知道复杂对象的内部组成部分与装配方式,只需要知道建造者的类型即可。它关注如何一步一步创建一个复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立,增加新的建造者非常方便,系统具有较好的扩展性。
二、模式定义


  • 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。
三、模式结构

1.png

产品:一个由多种组件组合生成的复杂对象
  1. public class Product {
  2.         private String partA; //定义部件,部件可以是任意类型,包括值类型和引用类型
  3.         private String partB;
  4.         private String partC;
  5.         //partA的Getter方法和Setter方法省略
  6.         //partB的Getter方法和Setter方法省略
  7.         //partC的Getter方法和Setter方法省略
  8. }
复制代码
抽象建造者
  1. public abstract class Builder {
  2.     //创建产品对象
  3.     protected Product product=new Product();
  4.     public abstract void buildPartA();
  5.     public abstract void buildPartB();
  6.     public abstract void buildPartC();
  7.     //返回产品对象
  8.     public Product getResult() {
  9.         return product;
  10.     }
  11. }
复制代码
具体建造者
  1. public class ConcreteBuilder1 extends Builder{
  2.     public void buildPartA() {
  3.         product.setPartA("A1");
  4.     }
  5.     public void buildPartB() {
  6.         product.setPartB("B1");
  7.     }
  8.     public void buildPartC() {
  9.         product.setPartC("C1");
  10.     }
  11. }
复制代码
指挥者
  1. public class Director {
  2.     private Builder builder;
  3.     public Director(Builder builder) {
  4.         this.builder=builder;
  5.     }
  6.     public void setBuilder(Builder builder) {
  7.         this.builder=builer;
  8.     }
  9.     //产品构建与组装方法
  10.     public Product construct() {
  11.         builder.buildPartA();
  12.         builder.buildPartB();
  13.         builder.buildPartC();
  14.         return builder.getResult();
  15.     }
  16. }
复制代码
客户
  1. ......
  2. Builder builder = new ConcreteBuilder1(); //可通过配置文件实现
  3. Director director = new Director(builder);
  4. Product product = director.construct();
  5. ......
复制代码
四、案例实现

案例背景

每一份套餐都是由不同的food和drink组成
案例结构

2.png

代码实现

Meal
  1. public class Meal {
  2.     private String food;
  3.     private String drink;
  4.     public String getFood() {
  5.         return food;
  6.     }
  7.     public void setFood(String food) {
  8.         this.food = food;
  9.     }
  10.     public String getDrink() {
  11.         return drink;
  12.     }
  13.     public void setDrink(String drink) {
  14.         this.drink = drink;
  15.     }
  16. }
复制代码
MealBuilder
  1. public abstract class MealBuilder {
  2.     protected Meal meal = new Meal();
  3.     public abstract void buildFood();
  4.     public abstract void buildDrink();
  5.     public Meal getMeal() {
  6.         return meal;
  7.     }
  8. }
复制代码
具体建造者A
  1. public class MealBuilderA extends MealBuilder{
  2.     @Override
  3.     public void buildFood() {
  4.         this.meal.setFood("AFood");
  5.     }
  6.     @Override
  7.     public void buildDrink() {
  8.         this.meal.setDrink("ADrink");
  9.     }
  10. }
复制代码
具体建造者B
  1. public class MealBuilderB extends MealBuilder{
  2.     @Override
  3.     public void buildFood() {
  4.         this.meal.setFood("BFood");
  5.     }
  6.     @Override
  7.     public void buildDrink() {
  8.         this.meal.setDrink("BDrink");
  9.     }
  10. }
复制代码
指挥者类
  1. public class Director {
  2.     private MealBuilder mb;
  3.     public void setMb(MealBuilder mb) {
  4.         this.mb = mb;
  5.     }
  6.     public Meal construct(){
  7.         mb.buildFood();
  8.         mb.buildDrink();
  9.         return mb.getMeal();
  10.     }
  11. }
复制代码
客户类
  1. public class Client {
  2.     public static void main(String[] args) {
  3.         MealBuilderA mbA = new MealBuilderA();//选择套餐
  4.         Director director = new Director();//叫服务员
  5.         director.setMb(mbA);//告知服务员
  6.         Meal meal = director.construct();//服务员上套餐
  7.         System.out.println("套餐A:");
  8.         System.out.println(meal.getFood());
  9.         System.out.println(meal.getDrink());
  10.     }
  11. }
复制代码
五、模式分析

在一个复杂对象由很多复杂的属性组成,不同的属性组成不同的复杂对象,建造者使用setter注入不同的属性,指挥者包含建造者,在指挥者内调用建造者方法获取复杂对象
六、总结

模式优点


  • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
  • 每一个具体建造者都相对独立,与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,扩展方便,符合开闭原则
  • 可以更加精细地控制产品的创建过程
模式缺点


  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,不适合使用建造者模式,因此其使用范围受到一定的限制
  • 如果产品的内部变化复杂,可能会需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加了系统的理解难度和运行成本
使用情形


  • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员变量
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序
  • 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
简化


  • 省略抽象建造者角色-(系统中只需要1个建造者时)
  • 省略指挥者角色-(系统中只需要1个建造者是,省略抽象建造者、还可继续省略指挥者,让Builder角色扮演指挥者与建造者双重角色

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册