추상 팩토리와 빌더
서로 관련된 객체군을 생성하는 추상 팩토리와 복잡한 객체를 단계적으로 구성하는 빌더를 살펴봅니다.
추상 팩토리와 빌더은(는) CoddyKit의 무료 Clean Architecture & Design Patterns in Practice 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 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.
자주 묻는 질문
“추상 팩토리와 빌더” 강의는 무료인가요?
네 — “추상 팩토리와 빌더” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Clean Architecture & Design Patterns in Practice 강의 전체를 잠금 해제할 수 있습니다. Clean Architecture & Design Patterns in Practice 강의에는 총 4개의 강의가 포함되어 있습니다.
“추상 팩토리와 빌더”에서 뭘 배우나요?
서로 관련된 객체군을 생성하는 추상 팩토리와 복잡한 객체를 단계적으로 구성하는 빌더를 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 Clean Architecture & Design Patterns in Practice을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Clean Architecture & Design Patterns in Practice을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Clean Architecture & Design Patterns in Practice은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“추상 팩토리와 빌더” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Clean Architecture & Design Patterns in Practice 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Clean Architecture & Design Patterns in Practice 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 싱글턴과 팩토리 메서드
- 추상 팩토리와 빌더
- 프로토타입과 객체 풀
- 생성 기법으로서의 의존성 주입