(μ½λλ Java κΈ°μ€)
κ΅³μ΄ λ΄μ©μ μ 리νμ§λ μμΌλ €κ³ νλλ°, 'ν νλ¦Ώ λ©μλμ ν©ν 리 λ©μλμ μ°¨μ΄μ μ΄ λκ°μ?'λΌλ μ§λ¬Έμ λ³΄κ³ λ§μλ€. μ, μ΄κ±΄ μ 리ν΄μΌκ² λ€ μΆμ΄μ μμ κ°λ λΆν° λ€μ 곡λΆνλ€.
κ²°λ‘ λΆν° λ§νμλ©΄, ν νλ¦Ώ λ©μλ ν¨ν΄μ μΌλ ¨μ νλ‘μΈμ€λ₯Ό κ³ μ μμΌλκ³ μ°μ΄λ΄λ― μ¬μ©ν μ μκ² μ€κ³νλ λ°©μμ΄λ€. μ¬λ¬ λ² μ¬μ©νκ³ νλ‘μΈμ€μ ν° λ³νκ° μλ μκ³ λ¦¬μ¦μΌ λ μ¬μ©νλ€. κ° λ¨κ³ μμμλ λ³κ²½(νμ₯)μ΄ μμ μ μμΌλ©° μ΄λ₯Ό μ²λ¦¬νκΈ° μν΄ μΈλΆ λ¨κ³λ ꡬν ν΄λμ€μμ μ μνλ€.
ν©ν 리 λ©μλ ν¨ν΄λ μ΄λ¦μμμ²λΌ μ°μ΄λ΄λ― μ€κ³νλ λ°©μμ΄λ€. ν νλ¦Ώ λ©μλλ₯Ό κΈ°λ°μΌλ‘ νκΈ° λλ¬Έμ λΉμ·ν λλμ΄λΌκ³ μκ°ν μλ μλλ°, ν νλ¦Ώ λ©μλ ν¨ν΄μ ν μΌμ΄μ€κ°μ λλμ΄λ€. 곡μ₯μ΄λΌλ μ΄λ¦λ΅κ² 'κ°μ²΄'λ₯Ό λ€λ£¨λλ° μ£Όμ΄μ§ 쑰건μ λ§λ κ°μ²΄λ₯Ό 리ν΄νλ―λ‘ μ€νΈλν°μ§ ν¨ν΄κ³Όλ κ΄λ ¨ μλ€ λ³Ό μ μκ² λ€.
Template Method Pattern
μκ³ λ¦¬μ¦μ ꡬ쑰λ λ³κ²½νμ§ μκ³ , κ° λ¨κ³λ₯Ό μ¬μ μν μ μκ² νλ λμμΈ ν¨ν΄
π When To Use
- μκ³ λ¦¬μ¦ μ 체 ꡬ쑰λ μ μ§νλ νΉμ λ¨κ³λ§ νμ₯(μ¬μ μ)ν΄μΌ νλ κ²½μ°
- κ±°μ λΉμ·ν μκ³ λ¦¬μ¦μ ν¬ν¨νλ μ¬λ¬ ν΄λμ€κ° μλ κ²½μ°
π κΈ°λ³Έ μ€κ³
μκ³ λ¦¬μ¦μ κ° λ¨κ³λ₯Ό λ©μλλ‘ λΆλ¦¬νλ€.
- μΈλΆ ν¨ν€μ§μμ λ©μλ μΈλΆ λ΄μ©μ μ κ·Όνμ§ λͺ»νκ² νλ €λ©΄ μ κ·Ό μ μ΄μλ₯Ό μ€μ ν΄μ€ κ²
μΆμ ν΄λμ€μλ λ³κ²½λμ§ μμ μμλ₯Ό μ μνλ€.
- μκ³ λ¦¬μ¦ μμλ₯Ό templateMethod() λ©μλμ μ μνλ€. μΈλΆμμλ μ΄ λ©μλλ₯Ό νΈμΆνμ¬ μκ³ λ¦¬μ¦μ μ€ννλ€.
- Primitive λ©μλλ λ°λμ μ¬μ μν΄μΌ νλ€. ꡬνλ§λ€ λ³κ²½λ μ μλ μμλ₯Ό λ΄λλ€.
- Hook λ©μλλ νμμ λ°λΌ μ¬μ μν μ μλ€. λ³κ²½λμ§ μκ±°λ λ³κ²½μ΄ μ νμ μΈ μμλ₯Ό λ΄λλ€.
ꡬν ν΄λμ€μμλ κ° μν©μ λ§κ² λ©μλλ₯Ό μ¬μ μνλ€.
π μ μ© λ°©λ²
package customLibrary;
public abstract class GoingOut {
// primitive λ©μλ
abstract void wearClothes();
// hook λ©μλ
void openDoor() {
System.out.println("λ¬Έμ μ΄κ³ λκ°λ€.");
}
// μΈλΆμμ νΈμΆνλ λ©μλ
public void prepare() {
wearClothes();
openDoor();
}
}
class MeetFriends extends GoingOut {
@Override
void wearClothes() {
System.out.println("νλν°λ₯Ό μ
λλ€.");
}
@Override
void openDoor() {
// You can override operation
// Or not
// System.out.println("λ
Έν¬ν λ€ λ¬Έμ μ΄κ³ λκ°λ€.");
}
}
package whatever;
class Main {
MeetFriends plan;
void init() {
plan = new MeetFriends();
}
void execute() {
plan.prepare();
}
}
/***
*
* < output >
* νλν°λ₯Ό μ
λλ€.
* λ¬Έμ μ΄κ³ λκ°λ€.
*
*/
Factory Method Pattern
쑰건μ μ ν©ν κ°μ²΄λ₯Ό λ°ννλ λμμΈ ν¨ν΄
π When To Use
μμ ν κ°μ²΄μ μ νν μ νκ³Ό μ’ μμ±μ λͺ¨λ₯΄λ κ²½μ°
- μλ°μμ μ λλ¦ μ¬μ©νλ λλ..?
λΌμ΄λΈλ¬λ¦¬/νλ μμν¬μ λ΄λΆ κ΅¬μ± μμ νμ₯μ μ 곡ν νμκ° μλ κ²½μ°
- μλ‘μ΄ μμ(Product)λ₯Ό μΆκ°νκ³ μΆμΌλ©΄ ν΄λΉ Concrete Productλ₯Ό λ°ννλ μλ‘μ΄ Concrete Creatorλ§ μ μνλ©΄ λλ€.
- 리μμ€ μ μ½μ μν΄ κ°μ²΄λ₯Ό μ¬μ¬μ©νμ¬ νΉμ± μμ μ΄ μ©μ΄νλ€.
π κΈ°λ³Έ κ°λ
Product
- ν©ν 리 λ©μλμμ λ°νν κ°μ²΄μ μΈν°νμ΄μ€
ConcreteProduct
- Productμ ꡬν ν΄λμ€(λ€)
Creator
- Product νμ μ κ°μ²΄λ₯Ό λ°ννλ ν©ν 리 λ©μλλ₯Ό μ μΈνλ ν΄λμ€
ConcreteCreator
- Creatorμ ν©ν 리 λ©μλλ₯Ό μ¬μ μνμ¬ ConcreteProductλ₯Ό λ°ν
ClientCode
- ν©ν 리 λ©μλλ₯Ό μ¬μ©νλ μ€μ μ½λ. ν΄λΉ μ½λμμλ λ°νλλ κ°μ²΄κ° 무μμΈμ§ μ μ μκ³ , μ νμλ μλ€. μ΄λ€ κ°μ²΄λ κ°μ μ²λ¦¬νλ νλ‘μΈμ€λ₯Ό μΆμμ μΌλ‘ λ€λ€μΌ νλ€.
π μ μ© λ°©λ²
λ€μν ν©ν 리 ꡬν λ°©μμ λΉκ΅ (refactoring.guru)
μλ μ½λλ enumμ μ¬μ©ν΄μ μμ± κ°μ²΄λ₯Ό ꡬλΆνλ λ°©μμ΄ μλ, μλΈ ν΄λμ€μμ μ¬μ μνμ¬ μμ± κ°μ²΄λ₯Ό ꡬλΆνλ λ°©μμ΄λ€. ( = Factory Method Pattern )
// Creator
abstract class TicketFactory {
// Factory Method
public abstract Ticket ticketFactory(int number);
}
// Concrete Creator
class ChildrenTicketFactory extends TicketFactory {
@Override
public Ticket ticketFactory(int number) {
ChildrenTicket ticket = new ChildrenTicket();
for (int i = 0; i < number; i++)
ticket.buyTicket();
return ticket;
}
}
// Concrete Creator
class AdultsTicketFactory extends TicketFactory{
// ... μλ΅
}
// Product
interface Ticket {
abstract void buyTicket();
}
// Concrete Product
class ChildrenTicket implements Ticket {
@Override
public void buyTicket() {
System.out.println("This ticket is for Children");
}
}
// Concrete Product
class AdultsTicket implements Ticket {
@Override
public void buyTicket() {
System.out.println("This ticket is for Adults");
}
}
class Main {
TicketFactory factory;
void init() {
// μ΄μ©κ³ μ μ©κ³ 쑰건 -> μ΄λ¦°μ΄ ν°μΌ μμ± ν λΉ
factory = new ChildrenTicketFactory();
}
void execute() {
// Client Codeλ μ΄λ€ ν©ν λ¦¬κ° μλμ§ μ νμ μλ€.
factory.ticketFactory(3);
}
}
μ°Έκ³ μλ£
'π μ€ν°λ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Java Spring κΈ°λ³Έμ μΈ μ§λ¬Έλ€ (0) | 2022.04.10 |
---|