CS/λ””μžμΈ νŒ¨ν„΄

[λ””μžμΈ νŒ¨ν„΄] νŒ©ν† λ¦¬ λ©”μ„œλ“œ(Factory Method) νŒ¨ν„΄

벼리01 2024. 1. 10. 20:52

 

νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄μ€ 생성 νŒ¨ν„΄ 쀑 ν•˜λ‚˜λ‘œ 객체 생성을 곡μž₯ ν΄λž˜μŠ€μ—κ²Œ μœ„μž„ν•˜λŠ” νŒ¨ν„΄μ„ λ§ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ ꡬ체 클래슀λ₯Ό  직접 μ–ΈκΈ‰ν•˜μ—¬ `new` μ—°μ‚°μžλ₯Ό ν˜ΈμΆœν•˜λŠ” λŒ€μ‹ , λ§Œλ“€κ³ μž ν•˜λŠ” 객체의 생성 μ±…μž„μ„ 맑은 곡μž₯ ν΄λž˜μŠ€μ—κ²Œ 객체 생성을 λ§‘κΈ΄λ‹€.

이름 κ·ΈλŒ€λ‘œ 객체λ₯Ό λ§Œλ“€μ–΄λ‚΄λŠ” 곡μž₯(Factory)λ₯Ό λ§Œλ“œλŠ” νŒ¨ν„΄μ΄λΌκ³  ν•  수 μžˆλ‹€. 곡μž₯ ν΄λž˜μŠ€μ—μ„œ 객체λ₯Ό λ§Œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λ©°, (μ—¬κΈ°μ„œ μΈν„°νŽ˜μ΄μŠ€λž€ 객체 생성을 ν•˜λŠ” λ©”μ„œλ“œλ₯Ό λœ»ν•œλ‹€. `ShapeFactory`μ—μ„œλŠ” `createShape()` λ©”μ„œλ“œκ°€ μΈν„°νŽ˜μ΄μŠ€λΌκ³  ν•  수 μžˆλ‹€.) ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€, 즉 곡μž₯ 클래슀λ₯Ό 상속 λ°›λŠ” 곡μž₯ μ„œλΈŒ ν΄λž˜μŠ€κ°€ λ§Œλ“€ 객체의 μœ ν˜•μ„ κ²°μ •ν•œλ‹€.

 

곡μž₯ μΈν„°νŽ˜μ΄μŠ€: 객체 생성 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€.

μ„œλΈŒ 곡μž₯ 클래슀: μ–΄λ–€ ꡬ체 클래슀λ₯Ό 생성할지 결정함.

 

예λ₯Ό λ“€μ–΄μ„œ, `Shape` μΈν„°νŽ˜μ΄μŠ€κ°€ μ‘΄μž¬ν•˜κ³  κ·Έλ₯Ό μƒμ†λ°›λŠ” `Circle`κ³Ό `Rectangle` ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•  경우 이 `shape` 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄μ„ μ‚¬μš©ν•œλ‹€κ³  ν–ˆμ„ λ•Œ, `ShapeFactory`λΌλŠ” 곡μž₯ μΈν„°νŽ˜μ΄μŠ€κ°€ 있고 κ·Έλ₯Ό μƒμ†λ°›λŠ” `CircleFactory` ν΄λž˜μŠ€μ™€ `RectangleFactory` 클래슀λ₯Ό μƒμ„±ν•œλ‹€.

μ΄λ ‡κ²Œ 객체 생성 곡μž₯이 λ”°λ‘œ μ‘΄μž¬ν•œλ‹€λ©΄ `Circle` 객체λ₯Ό μƒμ„±ν•˜κ³ μž ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ `Main`은 `Circle` ꡬ체 클래슀λ₯Ό μ „ν˜€ λͺ¨λ₯΄κ³ λ„ ν•΄λ‹Ή ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό 생성할 수 μžˆλ‹€. λ§ˆνŠΈμ—μ„œλŠ” 판맀λ₯Ό μœ„ν•΄ κ³Όμžκ°€ ν•„μš”ν•˜μ§€λ§Œ 과자λ₯Ό λ§Œλ“œλŠ” 방법은 λͺ¨λ₯΄λŠ” 것과 κ°™λ‹€. 곡μž₯μ—κ²Œ 과자λ₯Ό μ£Όλ¬Έν•˜λ©΄ 곡μž₯μ—μ„œ 과자λ₯Ό λ§Œλ“€μ–΄μ„œ λ§ˆνŠΈμ— κ³΅κΈ‰ν•˜λŠ” 것과 μœ μ‚¬ν•˜λ‹€. μ—¬κΈ°μ„œ λ§ˆνŠΈλŠ” ν΄λΌμ΄μ–ΈνŠΈ, 곡μž₯은 곡μž₯ 클래슀라고 ν•  수 μžˆλ‹€.

 

//	μΈν„°νŽ˜μ΄μŠ€
interface Shape {
    void draw();
}

//	κ΅¬ν˜„ 클래슀
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("동그라미λ₯Ό κ·Έλ¦½λ‹ˆλ‹€.");
    }
}

class Rectagle implements Shape {
    @Override
    public void draw() {
        System.out.println("μ§μ‚¬κ°ν˜•μ„ κ·Έλ¦½λ‹ˆλ‹€.");
    }
}

//	곡μž₯ μΈν„°νŽ˜μ΄μŠ€
interface ShapeFactory {
    Shape createShape();
}

//	곡μž₯ μ„œλΈŒ 클래슀(κ΅¬ν˜„ 클래슀)
class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

//	곡μž₯ μ„œλΈŒ 클래슀(κ΅¬ν˜„ 클래슀)
class RectangleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

 

//	ν΄λΌμ΄μ–ΈνŠΈ
public class Main {
    public static void main(String[] args) {
        // CircleFactoryλ₯Ό μ‚¬μš©ν•˜μ—¬ Circle을 생성함
        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        
        // 좜λ ₯: 동그라미λ₯Ό κ·Έλ¦½λ‹ˆλ‹€.
        circle.draw(); 
        
        // RectangleFactoryλ₯Ό μ‚¬μš©ν•˜μ—¬ Rectangle을 생성함
        ShapeFactory rectangleFactory = new RectangleFactory();
        Shape rectangle = rectangleFactory.createShape();
        
        //  좜λ ₯ : μ§μ‚¬κ°ν˜•μ„ κ·Έλ¦½λ‹ˆλ‹€.
        rectangle.draw(); 
    }
}

 

 

 

 

μŠ€ν”„λ§μ—μ„œ μ‚¬μš©λ˜λŠ” `AppConfig` λ˜ν•œ νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄μ˜ 일쒅이닀. 객체 생성을 μœ„ν•œ λ©”μ„œλ“œκ°€ λͺ¨μ—¬μžˆλ‹€. 객체 μƒμ„±μ˜ μ±…μž„μ„ κ°–λŠ” 클래슀인 것이닀.

 

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy(){
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }

}

 

`memberService()`의 κ΅¬ν˜„ κ°μ²΄λŠ” `memberRepository()` 즉 DAO κΈ°λŠ₯을 ν•˜λŠ” 객체에 μ˜μ‘΄ν•˜κ³  μžˆλ‹€. 이 `AppConfig` 객체가 객체의 생성을 담당함과 λ™μ‹œμ— μ˜μ‘΄μ„± μ£Όμž…μ˜ μ±…μž„λ„ λ‹΄λ‹Ήν•˜κ³  μžˆλŠ” 것이닀. 

 

 

νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄μ—μ„œ 곡μž₯ ν΄λž˜μŠ€λŠ” 주둜 객체 μƒμ„±μ˜ μ±…μž„λΏ μ•„λ‹ˆλΌ 더 ν™•μž₯될 수 μžˆλ‹€.

1. 기본적인 μ±…μž„μ€ 객체λ₯Ό μƒμ„±ν•˜λŠ” 것이닀.

2. ν•΄λ‹Ή 객체의 μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜κ±°λ‚˜ μ˜μ‘΄μ„±μ„ μ£Όμž…ν•  수 μžˆλ‹€.

3. 였브젝트 풀을 κ΄€λ¦¬ν•˜μ—¬ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” λŒ€μ‹  기쑴의 객체λ₯Ό μž¬ν™œμš©ν•  수 μžˆλ‹€.

 

 

예λ₯Ό λ“€μ–΄, μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„œλ²„μ™€ DB의 연결은 λΉ„μš©μ΄ 많이 λ“ λ‹€. `Connection`객체λ₯Ό μƒμ„±ν•˜κ³ , DB에 μ—°κ²°ν•˜κ³ , 쿼리λ₯Ό 보내고, 결과값을 λ°›μ•„ μ²˜λ¦¬ν•˜λŠ” 과정이 계속 반볡되기 λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ 객체λ₯Ό μƒμ„±ν•œλ‹€λ©΄ λΉ„μš©μ΄ 감당할 수 없이 μ»€μ§€κ²Œ λœλ‹€.  μ—¬κΈ°μ„œλ„ κ°€μž₯ 큰 λΉ„μš©μ„ μ°¨μ§€ν•˜λŠ” 것이 λ°”λ‘œ DB와 μ—°κ²°ν•˜λŠ” 과정인데, μ΄λ•Œ 미리 `Connection` 객체λ₯Ό μ—¬λŸ¬ 개 λ§Œλ“€μ–΄ 두고 μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ λΉŒλ €μ£ΌλŠ” 방법을 μ΄μš©ν•œλ‹€λ©΄ `Connection` 객체λ₯Ό μ—¬λŸ¬λ²ˆ μƒμ„±ν•˜λŠ” λΉ„μš©μ„ 쀄일 수 μžˆλ‹€. μ΄λ ‡κ²Œ 객체의 ν• λ‹Ή κ·ΈλŸ¬λ‹ˆκΉŒ 생성과 μ‚­μ œμ˜ λΉ„μš©μ΄ ν¬κ±°λ‚˜ 자주 μΌμ–΄λ‚˜λŠ” κ²½μš°μ— μ΄λŸ¬ν•œ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ μ„±λŠ₯μ—μ„œ 크게 이득을 λ³Ό 수 μžˆλ‹€. μ΄λ ‡κ²Œ `Connection` 객체λ₯Ό μ—¬λŸ¬κ°œ 생성해두고 μš”μ²­μ΄ 올 λ•Œλ§ˆλ‹€ λŒ€μ—¬ν•΄μ£Όμ—ˆλ‹€κ°€ λ‹€μ‹œ λ°˜ν™˜λ°›λŠ” 것을 컀λ„₯μ…˜ 풀이라고 ν•˜λŠ”λ°, λ™μ‹œ μ ‘μ†μžκ°€ λ§Žμ„ κ²½μš°μ— μš”μ²­ μ‹œλ§ˆλ‹€ `Connection` 객체λ₯Ό μƒμ„±ν•΄μ„œ ν• λ‹Ήν•΄μ£ΌλŠ” 것이 μ•„λ‹ˆλΌ (μš”μ²­μ΄ 올 λ•Œλ§ˆλ‹€ 객체λ₯Ό μƒμ„±ν•œλ‹€λ©΄ μ‹œκ°„μ΄ 더 였래 걸리겠죠?) 이미 λ§Œλ“€μ–΄λ‘” `Connection` 객체λ₯Ό ν• λ‹Ήν•΄μ£Όκ³  μž¬μ‚¬μš©ν•˜κΈ°λ₯Ό λ°˜λ³΅ν•œλ‹€. μ΄λ•Œ λͺ¨λ“  `Connection` μ΄ μ‚¬μš©λ˜κ³  μžˆλ‹€λ©΄ `Connection` 이 λ°˜ν™˜λ  λ•ŒκΉŒμ§€ λ²ˆν˜ΈμˆœλŒ€λ‘œ λŒ€κΈ° μƒνƒœλ‘œ κΈ°λ‹€λ¦¬κ²Œ λœλ‹€. 

 

μš°λ¦¬κ°€ μƒν’ˆ 관리 μ‹œμŠ€ν…œ, GOODS 클래슀λ₯Ό λ§Œλ“€μ—ˆμ„ λ•Œ μ‚¬μš©λ˜μ—ˆλ˜ `JDBCTemplate`이 `ConnectionFactory`라고 ν•  수 μžˆλ‹€. μš°λ¦¬κ°€ `Connection` 객체λ₯Ό 생성할 ν•„μš” 없이 이미 ν…œν”Œλ¦Ώμ΄ μ •μ˜λ˜μ–΄ μžˆμ–΄μ„œ ν•΄λ‹Ή ν΄λž˜μŠ€μ—μ„œ `getConnection()`을 ν˜ΈμΆœν•˜κΈ°λ§Œ ν•˜λ©΄ `Connection`을 κ°€μ Έμ˜¬ 수 μžˆμ—ˆλ‹€. `Connection` 객체λ₯Ό κ°€μ Έμ˜€λŠ” ν΄λΌμ΄μ–ΈνŠΈ, 즉 DAOμ—μ„œλŠ” μ–΄λ–€ DB에 μ—°κ²°λ˜λŠ”μ§€ ꡬ체적인 μ½”λ“œλ₯Ό λͺ¨λ₯΄κ³ λ„ `Connection` 객체λ₯Ό 생성할 수 μžˆλ‹€.

 

그런데 μ—¬κΈ°μ„œ, μš°λ¦¬λŠ” νŽΈμ˜μ„±μ„ μœ„ν•΄ JDBC Template을 static λ©”μ„œλ“œλ‘œ μ„ μ–Έν•˜κ³  μ‚¬μš©ν•˜μ˜€μ§€λ§Œ Springμ—μ„œ μ‚¬μš©λ˜λŠ” JDBC Template은 μœ μ‚¬ν•˜μ§€λ§Œ 쑰금 λ‹€λ₯΄λ‹€κ³  ν•  수 μžˆλ‹€. Springμ—μ„œλŠ” DAOκ°€ `JDBCTemplate`을 멀버 ν•„λ“œλ₯Ό κ°€μ§€κ³  μžˆλ‹€. μ΄λ•Œ DAOλŠ” `JDBCTemplate`에 μ˜μ‘΄ν•œλ‹€κ³  ν‘œν˜„ν•  수 μžˆλ‹€. 그리고 μ—¬κΈ°μ„œ 또 `JDBCTemplate`은 `DataSource`μ—κ²Œ μ˜μ‘΄ν•˜κ³  μžˆλ‹€. μ•„κΉŒ 컀λ„₯μ…˜ 풀에 λŒ€ν•΄μ„œ μ–˜κΈ°ν–ˆλŠ”λ°, μ›Ήμ—μ„œλŠ” μ‚¬μš©μžκ°€ ν•œλ‘λͺ…이 μ•„λ‹ˆλΌ λ§Žμ€ 수의 μœ μ €κ°€ λ™μ‹œμ— μ ‘κ·Όν•˜κΈ° λ•Œλ¬Έμ— Spring은 컀λ„₯μ…˜ 풀을 κ΄€λ¦¬ν•œλ‹€. 이 컀λ„₯μ…˜ 풀을 κ΄€λ¦¬ν•˜λŠ” 것이 `DataSource`이닀. 이 `DataSource`κ°€ `getConnection()` λ©”μ„œλ“œλ₯Ό κ°€μ§€κ³  μžˆλ‹€. Spring의  `DriverManagerDataSource`, `HikariDataSource` 등이 `DataSource`λ₯Ό κ΅¬ν˜„ν•œ 클래슀 쀑 ν•˜λ‚˜λ‹€. μ–΄λ–€ ν΄λž˜μŠ€μ— `DataSource`λ₯Ό μƒμ„±ν•˜λŠ” λ©”μ„œλ“œκ°€ μžˆλ‹€λ©΄, 이 λ©”μ„œλ“œλŠ” νŒ©ν† λ¦¬ λ©”μ„œλ“œμ— ν•΄λ‹Ήν•œλ‹€.

 

 

이처럼 곡μž₯ 클래슀의 μ±…μž„μ€ μš”κ΅¬ 사항에 따라 λ‹¬λΌμ§ˆ 수 μžˆλ‹€. 

 

곡μž₯ ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ μΈν„°νŽ˜μ΄μŠ€λ‘œ μ„ μ–Έλ˜μ–΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ 일반적으둜 객체 생성 λ©”μ„œλ“œμ˜ κ΅¬ν˜„μ„ κ°•μ œν•˜κΈ° μœ„ν•΄ μΈν„°νŽ˜μ΄μŠ€λ‘œ μ„€μ •ν•œλ‹€. JDK 1.9λΆ€ν„°λŠ” μΈν„°νŽ˜μ΄μŠ€μ— default λ©”μ„œλ“œ 선언이 ν—ˆμš©λ˜λ―€λ‘œ 곡μž₯ 클래슀λ₯Ό μΈν„°νŽ˜μ΄μŠ€λ‘œ μ„ μ–Έν•˜λŠ” 것이 쒋은 선택일 수 μžˆλ‹€.

 

 

// ꡐ톡 μˆ˜λ‹¨ μΈν„°νŽ˜μ΄μŠ€
interface Vehicle {
    void startEngine();
}

// κ΅¬ν˜„ 클래슀: μ°¨
class Car implements Vehicle {
    @Override
    public void startEngine() {
        System.out.println("μžλ™μ°¨κ°€ μΆœλ°œν•©λ‹ˆλ‹€~!");
    }
}

// κ΅¬ν˜„ 클래슀: 트럭
class Truck implements Vehicle {
    @Override
    public void startEngine() {
        System.out.println("트럭이 μΆœλ°œν•©λ‹ˆλ‹€~!");
    }
}

// κ΅¬ν˜„ 클래슀: μ˜€ν† λ°”μ΄
class Motorcycle implements Vehicle {
    @Override
    public void startEngine() {
        System.out.println("μ˜€ν† λ°”μ΄ 좜발~!");
    }
}

 

// ꡐ톡 μˆ˜λ‹¨ μΈν„°νŽ˜μ΄μŠ€
interface VehicleFactory {
    Vehicle createVehicle();
}

// μ°¨ 생성 곡μž₯
class CarFactory implements VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
}

// 트럭 생성 곡μž₯
class TruckFactory implements VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Truck();
    }
}

// μ˜€ν† λ°”μ΄ 생성 곡μž₯
class MotorcycleFactory implements VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Motorcycle();
    }
}

 

// ν΄λΌμ΄μ–ΈνŠΈ

public class Main {
    public static void main(String[] args) {
        // CarFactory둜 μžλ™μ°¨ 생성
        VehicleFactory carFactory = new CarFactory();
        Vehicle car = carFactory.createVehicle();
        // 좜λ ₯: μžλ™μ°¨κ°€ μΆœλ°œν•©λ‹ˆλ‹€~!
        car.startEngine(); // Output: Car Engine Started
        
        // TruckFactory둜 트럭 생성
        VehicleFactory truckFactory = new TruckFactory();
        Vehicle truck = truckFactory.createVehicle();        
        // 좜λ ₯: 트럭이 μΆœλ°œν•©λ‹ˆλ‹€~!
        truck.startEngine();
        
        // MotorcycleFactory둜 μ˜€ν† λ°”μ΄ 생성
        VehicleFactory motorcycleFactory = new MotorcycleFactory();
        Vehicle motorcycle = motorcycleFactory.createVehicle();        
        // 좜λ ₯: μ˜€ν† λ°”μ΄ 좜발~!
        motorcycle.startEngine();
    }
}

 

νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄μ˜ μ£Όμš” λͺ©μ μ€ 객체 생성에 λŒ€ν•œ μ±…μž„μ„ μ„œλΈŒ 클래슀, 즉 ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œκ°€ μ•„λ‹Œ λ‹€λ₯Έ 클래슀둜 λΆ„λ¦¬ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œκ°€ ꡬ체적인 ν΄λž˜μŠ€μ— 직접 μ˜μ‘΄ν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것이닀.

 

✨ μž₯점

ν΄λΌμ΄μ–ΈνŠΈκ°€ ꡬ체 클래슀λ₯Ό 직접 μ–ΈκΈ‰ν•˜μ§€ μ•Šκ³  μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜μ—¬ 객체λ₯Ό μƒμ„±ν•˜λ―€λ‘œ

1. ꡬ체 클래슀λ₯Ό 은닉할 수 μžˆλ‹€.

2. ν΄λΌμ΄μ–ΈνŠΈμ™€ ꡬ체 클래슀의 κ°•ν•œ 결합을 ν”Όν•  수 μžˆλ‹€.

3. 생성 μ½”λ“œκ°€ ν•œ κ³³(곡μž₯ 클래슀)에 λͺ¨μ—¬μžˆκΈ° λ•Œλ¬Έμ— μœ μ§€ λ³΄μˆ˜κ°€ μš©μ΄ν•˜λ‹€. μˆ˜μ • 및 ν™•μž₯이 μš©μ΄ν•˜λ‹€λŠ” 뜻인데, μ΄λŠ” 객체 μ§€ν–₯ 5λŒ€ 원칙 SOLID 쀑에 단일 μ±…μž„ 원칙(SRP: Single Responsibility Principle)κ³Ό 개방 폐쇄 원칙(OCP: Open Close Princlple)에 λΆ€ν•©ν•œλ‹€. 

객체의 λŠμŠ¨ν•œ κ²°ν•©μœΌλ‘œ μ˜μ‘΄μ„±μ„ κ΄€λ¦¬ν•˜λŠ” 생성 νŒ¨ν„΄μœΌλ‘œ 관리가 νš¨μœ¨μ μ΄λ‹€. 

 

πŸ‘Ž 단점

1. μ œν’ˆμ˜ μˆ˜κ°€ μ¦κ°€ν•˜λ©΄ 곡μž₯ ν΄λž˜μŠ€λ„ μ¦κ°€ν•˜κΈ° λ•Œλ¬Έμ— 관리가 λ²ˆκ±°λ‘œμ›Œμ§ˆ 수 μžˆλ‹€. 

2. ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ—μ„œ `new` μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 직접 객체λ₯Ό 생성할 λ•Œλ³΄λ‹€ 가독성이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€. 

 

λ˜ν•œ νŒ©ν† λ¦¬ λ©”μ„œλ“œ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ”λΌλ„ μƒˆλ‘œμš΄ ν΄λž˜μŠ€κ°€ 좔가될 λ•Œ ν•΄λ‹Ή ν΄λž˜μŠ€μ— λŒ€ν•œ νŒ©ν† λ¦¬λ₯Ό 생성해야 ν•˜λ―€λ‘œ, ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ—μ„œ μˆ˜μ •μ΄ λ°œμƒν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ Shape 클래슀λ₯Ό 상속 λ°›λŠ” 클래슀 쀑 `Rectangle` 클래슀 λŒ€μ‹ μ— `Triangle` ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό μƒμ„±ν•˜κ³  μ‹Άλ‹€λ©΄, `ShapeFactory` 클래슀λ₯Ό μƒμ†λ°›λŠ” `TriangleFactory` 클래슀λ₯Ό λ§Œλ“€κ³  ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ—μ„œ `TriangleFactory` 객체λ₯Ό μƒμ„±ν•˜μ—¬ `Shape` νƒ€μž…μ˜ `Triangle` 객체λ₯Ό 생성할 수 μžˆλ‹€.

 

이 νŒ¨ν„΄μ€ 객체 생성 λ‘œμ§μ΄λ‚˜ 클래슀 ꡬ쑰가 λ³΅μž‘ν•œ κ²½μš°μ— μœ μš©ν•˜κ²Œ μ‚¬μš©λœλ‹€. 

객체 생성 μš”κ΅¬ 사항이 λ‹¨μˆœν•˜κ±°λ‚˜ μ œν’ˆμ˜ μˆ˜κ°€ μ œν•œμ μΈ κ²½μš°μ—λŠ” 싱글톀과 같은 νŒ¨ν„΄μœΌλ‘œ λŒ€μ²΄ν•˜λŠ” 것이 더 효율적일 수 μžˆλ‹€.