工厂模式与建造者模式的区别

在软件设计中,工厂模式和建造者模式是两种常见的设计模式,它们都是用于创建对象,但是各自有不同的应用场景和目的。本文将通过餐馆点餐的例子,深入探讨这两种模式的区别。

工厂模式

工厂模式的核心思想是通过一个抽象工厂类来创建对象,而不直接使用构造函数。它主要用于当我们希望将对象的创建过程与使用过程分离时,并且可以支持多种类型的对象创建。

示例:餐馆的工厂模式

假设顾客走进一家餐馆,想要点餐。餐馆提供多种食物,比如披萨、汉堡和沙拉。我们可以使用工厂模式来创建这些食物。

java 复制代码
// 抽象产品
interface Food {
    void prepare();
}

// 具体产品
class Pizza implements Food {
    @Override
    public void prepare() {
        System.out.println("准备披萨...");
    }
}

class Burger implements Food {
    @Override
    public void prepare() {
        System.out.println("准备汉堡...");
    }
}

class Salad implements Food {
    @Override
    public void prepare() {
        System.out.println("准备沙拉...");
    }
}

// 抽象工厂
abstract class FoodFactory {
    public abstract Food createFood();
}

// 具体工厂
class PizzaFactory extends FoodFactory {
    @Override
    public Food createFood() {
        return new Pizza();
    }
}

class BurgerFactory extends FoodFactory {
    @Override
    public Food createFood() {
        return new Burger();
    }
}

class SaladFactory extends FoodFactory {
    @Override
    public Food createFood() {
        return new Salad();
    }
}

// 使用示例
public class Restaurant {
    public static void main(String[] args) {
        FoodFactory factory = new PizzaFactory();
        Food food = factory.createFood();
        food.prepare();
    }
}

在这个例子中,FoodFactory是一个抽象工厂,负责创建不同类型的食物对象。具体工厂如PizzaFactoryBurgerFactorySaladFactory实现了创建具体食物的逻辑。顾客只需要指定工厂类型,工厂就会返回对应的对象。

建造者模式

建造者模式用于构建一个复杂对象,尤其是当对象的构建过程涉及多个步骤或多个可选参数时。它通过提供一个灵活的构建接口,让用户能够逐步构造复杂对象。

示例:披萨的建造者模式

在我们的餐馆中,顾客可以根据个人喜好来定制披萨的配料,比如奶酪、西红柿和起司。我们可以使用建造者模式来实现这一点。

java 复制代码
class Pizza {
    private String cheese;
    private String tomato;
    private String extra;

    public static class Builder {
        private String cheese;
        private String tomato;
        private String extra;

        public Builder setCheese(String cheese) {
            this.cheese = cheese;
            return this;
        }

        public Builder setTomato(String tomato) {
            this.tomato = tomato;
            return this;
        }

        public Builder setExtra(String extra) {
            this.extra = extra;
            return this;
        }

        public Pizza build() {
            // 校验至少选择一种配料
            if (cheese == null && tomato == null && extra == null) {
                throw new IllegalArgumentException("至少选择一种配料!");
            }
            return new Pizza(this);
        }
    }

    private Pizza(Builder builder) {
        this.cheese = builder.cheese;
        this.tomato = builder.tomato;
        this.extra = builder.extra;
    }

    public void serve() {
        System.out.println("服务披萨: " + cheese + ", " + tomato + ", " + extra);
    }
}

// 使用示例
public class Customer {
    public static void main(String[] args) {
        try {
            Pizza pizza = new Pizza.Builder()
                    // .setCheese("马苏里拉") // Uncomment to test
                    .setTomato("新鲜")
                    .setExtra("香肠")
                    .build();
            pizza.serve();
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }
    }
}

在这个例子中,Pizza.Builder类允许顾客选择不同的配料,最终构建出一个完整的披萨对象。

区别总结

  1. 目的

    • 工厂模式:主要关注对象的创建,适用于创建简单或多种类型的对象。
    • 建造者模式:关注对象的构建过程,适用于构建复杂对象,尤其是有多个可选参数的情况,可以采用链式结构存储,
  2. 使用场景

    • 工厂模式:适合需要生成多个产品(如不同类型的食物)时,隐藏创建细节。
    • 建造者模式:适合构建步骤复杂的对象(如披萨),提供灵活的配置选项。
  3. 灵活性

    • 工厂模式:一般只提供一种创建方式。
    • 建造者模式:允许逐步构建,灵活性更高。

结论

在设计软件时,选择合适的模式至关重要。工厂模式和建造者模式各有其独特的优势,理解它们的区别和适用场景将有助于我们在实际开发中作出更好的设计选择。通过餐馆的例子,我们可以清晰地看到如何利用这两种设计模式来满足不同的需求。

相关推荐
Once_day11 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
若鱼191913 分钟前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王22 分钟前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
喜欢喝果茶.29 分钟前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
亓才孓30 分钟前
[Class类的应用]反射的理解
开发语言·python
努力学编程呀(๑•ี_เ•ี๑)30 分钟前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
码农小卡拉39 分钟前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮1 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu1 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
island13141 小时前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络