设计模式 - 建造者模式

简介: 设计模式 - 建造者模式

什么是建造者模式

建造者模式也称生成器模式 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(依赖倒转)

建造者模式的四个角色

1)Product(产品角色): 一个具体的产品对象。

2)Builder(抽象建造者): 创建一个 Product 对象的各个部件指定的 接口/抽象类。

3)ConcreteBuilder(具体建造者): 实现接口,构建和装配各个部件。

4)Director(指挥者): 构建一个使用 Builder 接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

建造者模式的注意事项和细节

  1. 1)客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
  2. 2)每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,

用户使用不同的具体建造者即可得到不同的产品对象

  1. 3)可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰, 也更方便使用程序来控制创建过程
  2. 4)增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”
  3. 5)建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  4. 6)如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,因此在这种情况下,要考虑是否选择建造者模式.
  5. 7)抽象工厂模式 VS 建造者模式
    抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品

类图:

代码:

产品

/*
 * 套餐类
 */
public class Meal {  
    private String food;  
    private String drink;  
    public String getFood() {  
        return food;  
    }  
    public void setFood(String food) {  
        this.food = food;  
    }  
    public String getDrink() {  
        return drink;  
    }  
    public void setDrink(String drink) {  
        this.drink = drink;  
    }  
}

抽象建造者

/*
 * 套餐构造器
 */
public abstract class MealBuilder {  
    protected Meal meal = new Meal();  
    public abstract void buildFood();  
    public abstract void buildDrink();  
    public Meal getMeal(){  
        return meal;  
    }  
}

具体建造者

/*
 * A套餐
 */
public class MealA : MealBuilder{  
    public  override void buildDrink() {  
        meal.setDrink("一杯可乐");  
    }  
    public   override  void buildFood() {  
        meal.setFood("一盒薯条");  
    }  
}
/*
 * B套餐
 */
public class MealB : MealBuilder{  
    public void buildDrink() {  
        meal.setDrink("一杯柠檬果汁");  
    }  
    public void buildFood() {  
        meal.setFood("三个鸡翅");  
    }  
}

指挥类

/*
 * 服务生
 */
public class KFCWaiter {  
    private MealBuilder mealBuilder;  
    public void setMealBuilder(MealBuilder mealBuilder) {  
        this.mealBuilder = mealBuilder;  
    }  
    public Meal construct(){  
        //准备食物  
        mealBuilder.buildFood();  
        //准备饮料  
        mealBuilder.buildDrink();  
        //准备完毕,返回一个完整的套餐给客户  
        return mealBuilder.getMeal();  
    }  
}

客户端

/*
 * 客户端
 */
public class App {  
    public static void main(String[] args) {  
        //服务员  
        KFCWaiter waiter = new KFCWaiter();  
        //套餐A  
        MealA a = new MealA();  
        //服务员准备套餐A  
        waiter.setMealBuilder(a);  
        //获得套餐  
        Meal mealA = waiter.construct();  
        //System.out.print("套餐A的组成部分:\r\n");  
        System.out.println(mealA.getFood()+"\r\n"+mealA.getDrink());  
    }  
}


相关文章
|
3月前
|
设计模式 Java
【设计模式系列笔记】建造者模式
建造者模式是一种创建型设计模式,用于将复杂对象的构建与其表示分离,使构建过程可定制。关键元素包括产品类(定义要构建的对象)、建造者接口(定义构建方法)、具体建造者类(实现构建过程)和指导者类(负责构建过程)。通过建造者模式,客户端可以灵活地创建具有不同表示的复杂对象,提高代码的可读性和可维护性,尤其适用于构建过程复杂且包含多个可选部分的情况。
121 1
|
3月前
|
设计模式 安全 Java
构建未来应用:Java设计模式 - 建造者模式(Builder)在现代编程中的应用
【4月更文挑战第7天】建造者模式是提升代码质量的关键,尤其在复杂环境中。它分步骤构建对象,将构建与表示分离,适用于UI构建、数据模型组装、配置文件解析和网络请求构造等场景。最佳实践包括明确构建步骤、提供默认值、支持链式调用和确保线程安全。然而,过多步骤、不一致状态和性能问题是使用时需注意的问题。掌握建造者模式对于现代编程至关重要。
53 3
|
2月前
|
设计模式 算法
建造者模式-大话设计模式
建造者模式-大话设计模式
19 1
|
1月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
22 0
|
3月前
|
设计模式 uml
大话设计模式(3)——造物者一般的建造者模式
大话设计模式(3)——造物者一般的建造者模式
29 1
大话设计模式(3)——造物者一般的建造者模式
|
2月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
2月前
|
设计模式 Java
Java设计模式:建造者模式之经典与流式的三种实现(四)
Java设计模式:建造者模式之经典与流式的三种实现(四)
|
2月前
|
设计模式 Java
Java设计模式之建造者模式详解
Java设计模式之建造者模式详解
|
2月前
|
设计模式 Java
设计模式之建造者模式
设计模式之建造者模式
|
2月前
|
设计模式
创建型设计模式之建造者模式
创建型设计模式之建造者模式