抽象工厂与建造者
探索如何使用抽象工厂创建相关对象族,并使用建造者分步构建复杂对象。
抽象工厂与建造者 是 CoddyKit 上的免费 Clean Architecture & Design Patterns in Practice 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Clean Architecture & Design Patterns in Practice 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Clean Architecture & Design Patterns in Practice 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Patterns for Object Creation
Welcome to this lesson on two powerful creational design patterns: Abstract Factory and Builder.
These patterns help us manage the complex process of creating objects, making our code more flexible and maintainable.
You'll learn when and how to use each to build robust applications.
Abstract Factory: The Problem
Imagine you're building an application that needs to support different 'themes' or 'operating systems' (like Windows and macOS) for its UI components.
You need to create a family of related objects (buttons, checkboxes, text fields) that all belong to a specific theme.
How do you ensure you're always creating the correct set of components for a chosen theme without hardcoding them?
Abstract Factory: The Solution
The Abstract Factory pattern provides an interface for creating families of related or interdependent objects without specifying their concrete classes.
- It defines an Abstract Factory (an interface) with methods for creating each product type (e.g.,
createButton(),createCheckbox()). - Concrete Factories implement this interface, each responsible for creating products of a specific family (e.g.,
WindowsUIFactory,MacUIFactory). - Your client code interacts only with the abstract factory and abstract products, staying independent of concrete implementations.
Abstract Factory Code: UI Kit
Let's see how an Abstract Factory can create different UI components. Here, we define interfaces for Button and Checkbox, and an UIFactory to produce them for different OS styles.
interface Button {
void paint();
}
interface Checkbox {
void paint();
}
class WindowsButton implements Button {
@Override
public void paint() {
System.out.println("Rendered Windows Button");
}
}
class MacButton implements Button {
@Override
public void paint() {
System.out.println("Rendered Mac Button");
}
}
class WindowsCheckbox implements Checkbox {
@Override
public void paint() {
System.out.println("Rendered Windows Checkbox");
}
}
class MacCheckbox implements Checkbox {
@Override
public void paint() {
System.out.println("Rendered Mac Checkbox");
}
}
interface UIFactory {
Button createButton();
Checkbox createCheckbox();
}
class WindowsUIFactory implements UIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
class MacUIFactory implements UIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public Checkbox createCheckbox() {
return new MacCheckbox();
}
}
public class Main {
public static void main(String[] args) {
UIFactory factory;
String os = "Mac"; // Or "Windows"
if (os.equals("Windows")) {
factory = new WindowsUIFactory();
} else {
factory = new MacUIFactory();
}
Button button = factory.createButton();
Checkbox checkbox = factory.createCheckbox();
button.paint();
checkbox.paint();
}
}Builder Pattern: Complex Objects
Now, let's switch gears to the Builder pattern. Imagine you need to create a complex object, like a custom computer or a detailed report.
This object might have many optional parts, and its construction can involve a specific sequence of steps.
If you try to use a constructor with many parameters, it quickly becomes unreadable and hard to manage.
Builder Pattern: The Process
The Builder pattern separates the construction of a complex object from its representation.
- A separate Builder object is responsible for constructing the final Product step-by-step.
- It provides a fluent API (method chaining) to set various properties or parts of the object.
- Finally, a
build()method returns the fully constructed object. - This makes object creation code much cleaner and more readable, especially for objects with many optional parameters.
Builder Code: Custom Pizza!
Let's use the Builder pattern to create a custom Pizza. We can specify the crust, sauce, cheese, and toppings step-by-step, making the creation process clear.
class Pizza {
private String crust;
private String sauce;
private String cheese;
private String toppings;
public Pizza(String crust, String sauce, String cheese, String toppings) {
this.crust = crust;
this.sauce = sauce;
this.cheese = cheese;
this.toppings = toppings;
}
@Override
public String toString() {
return "Pizza with: " + crust + " crust, " + sauce + " sauce, " + cheese + " cheese, " + toppings + ".";
}
}
class PizzaBuilder {
private String crust = "thin";
private String sauce = "tomato";
private String cheese = "mozzarella";
private String toppings = "none";
public PizzaBuilder withCrust(String crust) {
this.crust = crust;
return this;
}
public PizzaBuilder withSauce(String sauce) {
this.sauce = sauce;
return this;
}
public PizzaBuilder withCheese(String cheese) {
this.cheese = cheese;
return this;
}
public PizzaBuilder withToppings(String toppings) {
this.toppings = toppings;
return this;
}
public Pizza build() {
return new Pizza(crust, sauce, cheese, toppings);
}
}
public class Main {
public static void main(String[] args) {
Pizza margherita = new PizzaBuilder()
.withCrust("classic")
.withSauce("tomato")
.withCheese("mozzarella")
.build();
System.out.println(margherita);
Pizza veggieDelight = new PizzaBuilder()
.withCrust("whole wheat")
.withSauce("pesto")
.withCheese("feta")
.withToppings("onions, peppers, olives")
.build();
System.out.println(veggieDelight);
}
}Patterns Compared
While both patterns deal with object creation, they solve different problems:
- Abstract Factory: Focuses on creating families of related objects. It provides a way to encapsulate a group of individual factories that have a common theme without exposing the concrete classes.
- Builder: Focuses on creating a single complex object step-by-step. It's ideal when an object has many parameters, some optional, and its construction involves a multi-stage process.
Abstract Factory returns a factory, Builder returns the product itself.
Practical Applications
You'll find these patterns in many real-world scenarios:
- Abstract Factory: Database connection factories (e.g., creating specific connection objects for MySQL, PostgreSQL, Oracle), cross-platform UI toolkits, or creating different configurations of a system.
- Builder: Constructing complex SQL queries, generating reports with many customizable sections, configuring HTTP requests, or creating complex data transfer objects (DTOs).
They bring clarity and flexibility to object instantiation.
Quick Check
Consider the problems below. Which of them are typically best solved using the Abstract Factory pattern?
Abstract Factory & Builder Recap
Great job! In this lesson, you explored two powerful creational patterns:
- Abstract Factory: Best for creating families of related objects, ensuring consistency across different implementations.
- Builder: Perfect for constructing complex objects step-by-step, especially when they have many optional parts, making the creation process clear and manageable.
These patterns are crucial tools for designing flexible and maintainable software systems.
用 AI 导师学习 Clean Architecture & Design Patterns in Practice — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 12
- 课程
- 48
常见问题解答
「抽象工厂与建造者」课时是免费的吗?
是的 — 「抽象工厂与建造者」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Clean Architecture & Design Patterns in Practice 课程的其余内容,请升级到 CoddyKit PRO。 Clean Architecture & Design Patterns in Practice 课程共包含 4 节课。
「抽象工厂与建造者」这节课中我会学到什么?
探索如何使用抽象工厂创建相关对象族,并使用建造者分步构建复杂对象。 你通过在浏览器中直接运行的动手代码来练习 Clean Architecture & Design Patterns in Practice,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Clean Architecture & Design Patterns in Practice 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Clean Architecture & Design Patterns in Practice 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「抽象工厂与建造者」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Clean Architecture & Design Patterns in Practice 课中编写并运行代码吗?
能。每节 Clean Architecture & Design Patterns in Practice 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 单例与工厂方法
- 抽象工厂与建造者
- 原型与对象池
- 将依赖注入作为创建型技术