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

ops/2024/10/20 13:28:22/

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

工厂模式

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

示例:餐馆的工厂模式

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

java">// 抽象产品
interface Food {void prepare();
}// 具体产品
class Pizza implements Food {@Overridepublic void prepare() {System.out.println("准备披萨...");}
}class Burger implements Food {@Overridepublic void prepare() {System.out.println("准备汉堡...");}
}class Salad implements Food {@Overridepublic void prepare() {System.out.println("准备沙拉...");}
}// 抽象工厂
abstract class FoodFactory {public abstract Food createFood();
}// 具体工厂
class PizzaFactory extends FoodFactory {@Overridepublic Food createFood() {return new Pizza();}
}class BurgerFactory extends FoodFactory {@Overridepublic Food createFood() {return new Burger();}
}class SaladFactory extends FoodFactory {@Overridepublic 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. 灵活性

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

结论

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


http://www.ppmy.cn/ops/122013.html

相关文章

Vue-Lecture1-Notes

渐进式框架 Vue 被称为“渐进式框架”,是因为它允许开发者根据项目的需求逐步引入和使用其功能,而不需要一次性使用整个框架。简单来说,Vue 提供了从简单到复杂的功能层次,可以灵活选择使用。 按需使用:Vue 的核心功能…

【MYSQL】mysql约束---自增长约束(auto_increment)

1、概念 在Mysql中,当主键为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。 注意:自增长约束通常与主键放在一起使用。 通过给…

SQL第11课——使用子查询

11.1 子查询 查询(query): 任何SQL语句都是查询,但此术语一般指select语句。 select语句是SQL的查询,迄今为止所有的select语句都是简单查询,即从单个数据库表中检索数据的单条语句。 SQL还允许创建子查询(subquer…

Spring的热部署工具和数据库密码加盐操作

1.布置热部署 引言:在程序运行起来后,如果我们对代码进行了修改,需要重新测试修改后的程序,就得重新启动程序,这样很麻烦。于是引入热部署之后,我们就不需要重新启动程序,会自动更正。 1.配置po…

修改ID不能用关键字作为ID校验器-elementPlus

1、校验器方法 - forbiddenCharValidator const idUpdateFormRef ref(null); const forbiddenCharValidator (rule, value, callback) > {const forbiddenCharacters [as,for,default,in,join,left,inner,right,where,when,case,select];for (let forbiddenCharacter o…

Ansible学习之ansible-pull命令

想要知道ansible-pull是用来做什么的,就需要了解Ansible的工作模,Ansible的工作模式有两种: push模式 push推送,这是Ansible的默认模式,在主控机上编排好playbook文件,push到远程主机上来执行。pull模式 p…

6.MySQL基本查询

目录 表的增删查改Insert(插入)插入替换插入替换2 Retrieve(查找)SELECT 列全列查找指定列查询查询字段为表达式为查询结果指定别名结果去重 WHERE 条件order by子句筛选分页结果 Update(更新)delete&#…

【Docker从入门到进阶】03.进阶应用

3. 进阶应用 在本节中,我们将深入探讨Docker的高级应用,包括如何通过Dockerfile定义和构建镜像,数据管理的最佳实践,网络配置,以及如何使用Docker Compose来管理多容器应用。 基本指令详解 FROM: 可以使用特定版本的…