Design Patterns - low-hill/Knowledge GitHub Wiki
Singleton Pattern
μ±κΈν€ λμμΈ ν¨ν΄λ ν΄λμ€κ° νλμ μΈμ€ν΄μ€λ§ κ°μ§λλ‘ νκ³ μ¬λ¬ λ² νΈμΆμ΄ λλλΌλ μΈμ€ν΄μ€λ₯Ό μλ‘ μμ±νμ§ μκ³ μ΅μ΄ νΈμΆ μμ λ§λ€μ΄λμλ μΈμ€ν΄μ€λ₯Ό μ¬νμ©νλ ν¨ν΄μ΄λ€. μ±κΈν€ λμμΈ ν¨ν΄λ μ΄ν리μΌμ΄μ μμ νλ‘κ·Έλ¨ μ 체μμ μ¬μ©λλ κ΅¬μ± μ€μ , λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ ν λλ λ‘κ±° κ΄λ¦¬μ κ°μ΄ ν΄λμ€μ μΈμ€ν΄μ€ μλ₯Ό νλλ‘ μ ννλ €λ κ²½μ°μ μμ£Ό μ¬μ©λλ€.
-
μ±κΈν€ ν¨ν΄μ μ¬μ©νλ©΄ 리μμ€λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μλ€.
- μλ₯Ό λ€μ΄ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ νμ νλμ μΈμ€ν΄μ€λ‘ μ ννμ¬ λ§μ μμ λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ μμ±μ λ°©μ§
-
μ±κΈν€ ν¨ν΄μ μ¬λ°λ₯΄κ² ꡬννλ©΄ νλμ μΈμ€ν΄μ€λ§ μμ±λλλ‘ ν¨μΌλ‘μ¨ μ€λ λ μμ μ±μ μ 곡ν μ μλ€.
- μ΄λ λ©ν°μ€λ λ νκ²½μμ κ²½μμ λ°©μ§νκ³ μ μ ν λκΈ°νλ₯Ό 보μ₯νκΈ° μν΄ λ§€μ° μ€μ
public class ConfigurationManager {
private static ConfigurationManager instance;
private String databaseUrl;
private int maxConnections;
// Private constructor to prevent creating multiple instances
private ConfigurationManager() {
this.databaseUrl = "jdbc:mysql://localhost:3306/mydatabase";
this.maxConnections = 10;
}
// Method to get the one and only instance of ConfigurationManager
public static ConfigurationManager getInstance() {
if (instance == null) {
instance = new ConfigurationManager(); // Create the instance if it doesn't exist yet
}
return instance;
}
// Getter methods for configuration settings
public String getDatabaseUrl() {
return databaseUrl;
}
public int getMaxConnections() {
return maxConnections;
}
public void setMaxConnections(int maxConnections) {
this.maxConnections = maxConnections;
}
}
Factory Design Pattern
ν©ν 리 ν¨ν΄μ κ°μ²΄ μμ±μ κ³Όμ μ μΆμννλ μμ±ν λμμΈ ν¨ν΄μ λλ€. μ΄ ν¨ν΄μ κ°μ²΄λ₯Ό μμ±ν λ, κ°μ²΄μ ꡬ체μ μΈ νμ μ λͺ μνμ§ μκ³ , μλΈν΄λμ€λ μ λ¬Ένλ ν©ν 리 ν΄λμ€μ κ°μ²΄ μμ± μ± μμ μμν©λλ€. μ΄λ¬ν μΆμνλ μ½λμ μ μ°μ±κ³Ό μ μ§λ³΄μμ±μ λμ¬μ€λλ€.
ν©ν 리 λμμΈ ν¨ν΄μ κ΅¬μ± μμ
ν©ν 리 λμμΈ ν¨ν΄μ ꡬννκΈ° μ μ ν¨ν΄μ ꡬμ±νλ μ£Όμ μμλ€μ λν΄ μ΄ν΄ν©λλ€. κ° κ΅¬μ± μμλ κ°μ²΄ μμ± κ³Όμ μ λΆλ¦¬νμ¬ μ μ°μ±κ³Ό νμ₯μ±μ μ 곡νλλ° μ€μν μν μ ν©λλ€. μλλ ν©ν 리 ν¨ν΄μ ν΅μ¬ κ΅¬μ± μμλ€μ λλ€:
-
Product (μ ν)
Productλ μμ±ν κ°μ²΄μ νμ μ μ μνλ μΈν°νμ΄μ€ λλ μΆμ ν΄λμ€μ λλ€. μ΄ μμλ ν©ν λ¦¬κ° μμ±ν΄μΌ ν κ°μ²΄λ€μ΄ κ°μ ΈμΌ ν 곡ν΅μ μΈ μμ±μ΄λ λ©μλλ₯Ό μ μΈν©λλ€. μ€μ κ°μ²΄λ€μ΄ μ΄ μΈν°νμ΄μ€λ₯Ό ꡬννκ±°λ, μΆμ ν΄λμ€λ₯Ό νμ₯νμ¬ κ΅¬μ²΄νλ©λλ€. -
Concrete Product (ꡬ체μ μΈ μ ν)
Concrete Productλ Product μΈν°νμ΄μ€λ₯Ό ꡬννκ±°λ Product μΆμ ν΄λμ€λ₯Ό μμλ°λ μ€μ ν΄λμ€λ€μ λλ€. μ΄λ€μ ν©ν λ¦¬κ° μμ±νλ μ€μ κ°μ²΄λ€λ‘, νΉμ ν κΈ°λ₯μ μννλ μΈμ€ν΄μ€λ₯Ό μ 곡ν©λλ€. μ¦, ν©ν 리 ν¨ν΄μμ μ μλ 'μ ν'μ΄ κ΅¬μ²΄μ μΈ ννλ‘ λνλλ ν΄λμ€λ€μ λλ€. -
Factory (ν©ν 리)
Factoryλ κ°μ²΄λ₯Ό μμ±νλ ν©ν 리 λ©μλλ₯Ό μ μΈνλ μΈν°νμ΄μ€ λλ μΆμ ν΄λμ€μ λλ€. ν©ν 리μ μ£Όμ μν μ κ°μ²΄ μμ±μ μΆμννμ¬, μ€μ κ°μ²΄ μμ± λ°©λ²μ λν μΈλΆ ꡬνμ μΈλΆμμ μ¨κΈ°κ³ , κ°μ²΄λ₯Ό ν¨μ¨μ μΌλ‘ μμ±ν μ μλ λ©μλλ₯Ό μ 곡νλ κ²μ λλ€. -
Concrete Factory (ꡬ체μ μΈ ν©ν 리)
Concrete Factoryλ Factory μΈν°νμ΄μ€λ₯Ό ꡬννκ±°λ Factory μΆμ ν΄λμ€λ₯Ό μμλ°λ ꡬ체μ μΈ ν΄λμ€μ λλ€. μ΄ ν΄λμ€λ ν©ν 리 λ©μλλ₯Ό ꡬννμ¬, νΉμ ν μ’ λ₯μ Product κ°μ²΄λ₯Ό μμ±νλ μν μ ν©λλ€. κ° Concrete Factoryλ νΉμ Product μ νμ μμ±νλ λ°©λ²μ μ μνλ©°, μ΄λ‘μ¨ λ€μν μ’ λ₯μ κ°μ²΄λ€μ μ μ°νκ² μμ±ν μ μλλ‘ ν©λλ€.
ν©ν 리 λμμΈ ν¨ν΄μ μ₯λ¨μ λΆμ
μ£Όμ μ₯μ :
ν©ν 리 ν¨ν΄μ κ°μ²΄ μμ± λ‘μ§μ μ€μννμ¬ μ½λμ μ μ§λ³΄μμ±μ λμ΄κ³ , μλ‘μ΄ κ°μ²΄λ₯Ό μΆκ°ν λ κΈ°μ‘΄ μ½λλ₯Ό λ³κ²½νμ§ μμλ λλ μ₯μ μ΄ μμ΅λλ€. κ·Έλ¬λ ν¨ν΄μ μ¬μ©μ΄ λΆνμνκ² λ³΅μ‘μ±μ μ΄λν μ μμΌλ©°, ν΄λΌμ΄μΈνΈκ° ν©ν 리μ μμ‘΄νκ² λλ λ¨μ λ μ‘΄μ¬ν©λλ€. λ°λΌμ κ°μ²΄ μμ±μ΄ 볡μ‘νκ±°λ λ€μν ννλ₯Ό κ°μ§ λ μ μ©νκ² μ¬μ©ν μ μμΌλ©°, μ μ ν μν©μμλ§ μ μ©νλ κ²μ΄ μ€μν©λλ€.
-
κ°μ²΄ μμ±μ κ²°ν©λ κ°μ: ν΄λΌμ΄μΈνΈλ νμν κ°μ²΄μ ꡬ체μ μΈ ν΄λμ€μ λν΄ μ νμκ° μμ΅λλ€. ν΄λΌμ΄μΈνΈλ ν©ν 리 λ©μλλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ²νκ³ , ν©ν 리λ μ μ ν κ°μ²΄λ₯Ό μμ±νμ¬ λ°νν©λλ€.
-
μ μ§λ³΄μμ± ν₯μ: κ°μ²΄ μμ± λ‘μ§μ΄ ν©ν 리μ μ§μ€λμ΄ μκΈ° λλ¬Έμ κ°μ²΄ μμ± λ°©μμ λ³κ²½μ΄ νμν κ²½μ°, ν΄λΉ ν©ν 리 λ΄μμλ§ μμ νλ©΄ λ©λλ€. μ΄λ‘ μΈν΄ ν΄λΌμ΄μΈνΈ μ½λλ λ€λ₯Έ μμ€ν λΆλΆμ μν₯μ μ£Όμ§ μκ² λ©λλ€.
-
λ³κ²½μ λν μ μ°μ± μ¦κ°: ν©ν 리 ν¨ν΄μ μλ‘μ΄ κ°μ²΄ νμ μ μΆκ°ν λ μ 리ν©λλ€. μλ‘μ΄ κ°μ²΄ μ ν(ꡬ체μ μΈ μ ν)μ μΆκ°ν λ κΈ°μ‘΄ μ½λλ₯Ό λ³κ²½νμ§ μκ³ μλ‘μ΄ ν©ν 리λ₯Ό μΆκ°νλ λ°©μμΌλ‘ ν΄κ²°ν μ μμ΅λλ€. μ΄λ μ½λμ νμ₯μ±μ λμ΄κ³ , μλ‘μ΄ μꡬμ¬νμ μ μ°νκ² λμν μ μκ² ν©λλ€.
-
μΌκ΄λ κ°μ²΄ μμ± λ³΄μ₯
ν©ν 리 ν¨ν΄μ 곡ν΅λ μΈν°νμ΄μ€(Product)λ₯Ό ν΅ν΄ κ°μ²΄ μμ± κ·μΉμ κ°μ ν©λλ€. μ΄ μΌκ΄μ±μ μ½λ μ μ§λ³΄μλ₯Ό μ½κ² νκ³ , μ€λ₯λ₯Ό μ΅μννλ λ° κΈ°μ¬ν©λλ€.
λ¨μ
-
μ 체 μ½λλ² μ΄μ€ 볡μ‘λ μ¦κ°
ν©ν 리 ν¨ν΄μ ꡬννλ©΄ μ½λλ² μ΄μ€μ μλ‘μ΄ μΆμν κ³μΈ΅μ΄ μΆκ°λ©λλ€. μ΄λ κ°λ°μμκ²λ μΆκ°μ μΈ νμ΅ λΆλ΄μ μ€ μ μκ³ , ν¨ν΄μ μ μ΄ν΄νμ§ λͺ»ν κ°λ°μμκ²λ νΌλμ μΌκΈ°ν μ μμ΅λλ€. -
ν©ν 리 λ‘μ§μ λν μμ‘΄μ±
ν΄λΌμ΄μΈνΈ μ½λκ° κ΅¬μ²΄μ μΈ μ ν(Concrete Products)μμ λΆλ¦¬λκΈ°λ νμ§λ§, μ¬μ ν ꡬ체μ μΈ ν©ν 리(Concrete Factories)μ κ°νκ² μμ‘΄ν©λλ€. λ°λΌμ ν©ν 리 λ‘μ§μ ν° λ³νκ° μμ κ²½μ° μ¬λ¬ λΆλΆμμ μν₯μ λ°μ μ μμ΅λλ€. -
볡μ‘ν κ°μ²΄ μμ±μ΄ μλ κ²½μ° μ€λ²μμ§λμ΄λ§
κ°μ²΄ μμ±μ΄ 볡μ‘νμ§ μκ±°λ λ³λμ±μ΄ μ μ κ²½μ°, ν©ν 리 ν¨ν΄μ μ μ©νλ©΄ μ€νλ € λΆνμν 볡μ‘μ±μ μ΄λν μ μμ΅λλ€. μ΄ ν¨ν΄μ κ°μ²΄ μμ± κ³Όμ μ λ³μκ° λ§κ±°λ 볡μ‘ν λ κ°μ₯ ν¨κ³Όμ μ λλ€.
Strategy Pattern
μ λ΅ ν¨ν΄μ νΉμ ν κ³μ΄μ μκ³ λ¦¬μ¦(κ³΅ν΅ μΈν°νμ΄μ€ λλ μΆμ ν΄λμ€λ₯Ό ꡬννλ ꡬ체μ μΈ ν΄λμ€)μ μ μνκ³ κ° μκ³ λ¦¬μ¦μ μΊ‘μννκ³ μνΈ κ΅ν κ°λ₯νκ² λ§λλ νμ μννΈμ¨μ΄ λμμΈ ν¨ν΄μ΄λ€. μκ³ λ¦¬μ¦μ μ¬μ©νλ 컨ν μ€νΈ(context)βλ₯Ό λ³κ²½νμ§ μκ³ λ μκ³ λ¦¬μ¦μ νμλ₯Ό λ³κ²½ν μ μλ€. μ΄ ν¨ν΄μ 컨ν μ€νΈμ μ λ΅ κ°μ²΄ κ°μ λμ¨ν κ²°ν©μ μ΄μ§νμ¬ μ½λλ₯Ό νμ₯ κ°λ₯νκ³ μ μ§λ³΄μμ μ©μ΄νλλ‘ νλ€.
μ λ΅ ν¨ν΄μμ 컨ν μ€νΈμ μ λ΅ κ°μ²΄λ ν΅μ¬ κ΅¬μ± μμ
- 컨ν
μ€νΈ(Context)
- μ λ΅μ μ¬μ©νλ ν΄λΌμ΄μΈνΈ κ°μ²΄μ λλ€. μ΄ κ°μ²΄λ μ λ΅μ μ€μ νκ³ μ€ννλ μν μ ν©λλ€.
- Strategy
- μκ³ λ¦¬μ¦(νμ)μ μ μνλ μΈν°νμ΄μ€μ λλ€. μ¬λ¬ κ°μ§ μκ³ λ¦¬μ¦μ΄ μ΄ μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μ 곡λ©λλ€.
- ConcreteStrategy
- Strategy μΈν°νμ΄μ€λ₯Ό ꡬνν ꡬ체μ μΈ μκ³ λ¦¬μ¦(νμ)μ μ 곡ν©λλ€.
μ λ΅ ν¨ν΄ μ₯μ
- μκ³ λ¦¬μ¦ κ΅μ²΄
- μ λ΅ ν¨ν΄μ μ¬μ©νλ©΄ ν΄λΌμ΄μΈνΈκ° μκ³ λ¦¬μ¦μ μ€νν λλ§λ€, νμμ λ°λΌ λ€μν μκ³ λ¦¬μ¦μ μ½κ² λ°κΏ μ μμ΅λλ€.
- ν΄λΌμ΄μΈνΈ μ½λμ μκ³ λ¦¬μ¦μ λΆλ¦¬
- μκ³ λ¦¬μ¦μ Strategy μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μΊ‘μνν¨μΌλ‘μ¨ ν΄λΌμ΄μΈνΈ μ½λμμ μκ³ λ¦¬μ¦μ λν μΈλΆ ꡬνμ μ νμκ° μμ΄μ§λλ€.
- κ°λ°©-νμ μμΉ
- μλ‘μ΄ μκ³ λ¦¬μ¦μ΄ μΆκ°λμ΄λ κΈ°μ‘΄ μ½λλ₯Ό μμ ν νμ μμ΄ μλ‘μ΄ ConcreteStrategyλ₯Ό μΆκ°νκΈ°λ§ νλ©΄ λ©λλ€.
μμ λ‘ μμ보λ μ λ΅ ν¨ν΄
λ€μκ³Ό κ°μ΄ κ²°μ μ΄ν리μΌμ΄μ
μ μ λ΅ λμμΈ ν¨ν΄μ μ¬μ©νμ¬ κ°λ
μ± λ° μ μ°μ±μ ν₯μμν€λ μλ₯Ό μ΄ν΄λ³Έλ€.
- μ λ΅(μΆμνλ μκ³ λ¦¬μ¦/νμ) μ μ
interface PaymentMethod {
double calculateProcessingFee(double amount);
}
- λ€μν νμ/μκ³ λ¦¬μ¦μ μ μνλ ꡬ체μ μΈ ν΄λμ€λ₯Ό μ μ
@Component
class CreditCardPayment implements PaymentMethod {
@Override
public double calculateProcessingFee(double amount) {
return amount * 0.01;
}
}
@Component
class DebitCardPayment implements PaymentMethod {
@Override
public double calculateProcessingFee(double amount) {
return amount * 0.02;
}
}
@Component
class NetBankingPayment implements PaymentMethod {
@Override
public double calculateProcessingFee(double amount) {
return amount * 0.005;
}
}
- 컨ν μ€νΈ(μ λ΅ μ€ν)
@Service
@Slf4j
public class PaymentService {
private final PaymentMethod creditCardPayment;
private final PaymentMethod debitCardPayment;
private final PaymentMethod netBankingPayment;
private Map<String, PaymentMethod> paymentMethodsMap;
PaymentService(PaymentMethod creditCardPayment,
PaymentMethod debitCardPayment, PaymentMethod netBankingPayment) {
this.creditCardPayment = creditCardPayment;
this.debitCardPayment = debitCardPayment;
this.netBankingPayment = netBankingPayment;
}
@PostConstruct
void init() {
paymentMethodsMap = new HashMap<>();
paymentMethodsMap.put("CreditCard", creditCardPayment);
paymentMethodsMap.put("DebitCard", debitCardPayment);
paymentMethodsMap.put("NetBanking", netBankingPayment);
}
public void processPayment(double amount, String paymentMethod) {
log.info("Processed amount: {}",
paymentMethodsMap.get(paymentMethod)
.calculateProcessingFee(amount));
}
}
- ν΄λΌμ΄μΈνΈ(μ λ΅ κ΅μ²΄/μ λ΅ μ€ν κ²°κ³Ό μ»μ)
@Component
class PaymentServiceClientRunner {
private final PaymentService paymentService;
public PaymentServiceClientRunner(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void executePayment() {
// Process payment with amount 100.0 and payment method as "CreditCard"
paymentService.processPayment(100.0, "CreditCard");
}
}
Reference
- Strategy Design Pattern β All You Need To Know
- Strategy Pattern
- https://medium.com/@thecodebean/factory-design-pattern-implementation-in-java-bd16ebb012e2
- https://blog.devgenius.io/design-pattern-factory-method-d218d77a015b
- https://levelup.gitconnected.com/creational-design-pattern-factory-method-2bf56676111b
- https://medium.com/nerd-for-tech/understanding-factory-method-design-pattern-4d7ba8f0dfc4