Search

심플 팩토리 패턴

class
디자인 패턴
상태
완료
날짜
목차

심플 팩토리 패턴

심플 팩토리 패턴(Simple Factory Pattern)은 객체 생성 메커니즘을 단순화하기 위한 디자인 패턴입니다.
이 패턴은 객체 생성을 처리하는 별도의 클래스(팩토리)를 사용하여, 클라이언트가 직접 생성자를 호출하는 대신 팩토리 클래스를 통해 객체를 생성하도록 합니다.

심플 팩토리, 팩토리 메소드, 추상 팩토리 패턴 공통정, 차이점

1.
심플 팩토리 패턴 (Simple Factory Pattern)
공통점 : 객체 생성을 캡슐화하고, 클라이언트 코드와 생성되는 객체를 분리합니다.
차이점 : 이 패턴은 팩토리 클래스 내에서 조건에 따라 인스턴스를 생성합니다. 클라이언트는 팩토리 클래스에 요청을 보내어 필요한 객체를 받습니다. 심플 팩토리는 다형성을 활용하지만 상속이나 인터페이스를 사용하지 않습니다.
2.
팩토리 메소드 패턴 (Factory Method Pattern)
공통점 : 객체 생성을 캡슐화하고, 클라이언트 코드와 생성되는 객체를 분리합니다.
차이점 : 이 패턴은 추상 클래스 또는 인터페이스를 사용하여 객체 생성을 서브 클래스에 위임합니다. 클라이언트는 추상 인터페이스를 통해 객체를 요청하고, 실제 생성되는 객체의 타입은 서브클래스에서 결정됩니다. 이는 상속을 기반으로 한 확장에 적합합니다.
3.
추상 팩토리 패턴 (Abstract Factory Pattern)
공통점 : 객체 생성을 캡슐화하고, 클라이언트 코드와 생성되는 객체를 분리합니다.
차이점 : 추상 팩토리 패턴은 여러 종류의 관련있는 또는 의존적인 객체들을 생성하기 위한 인터페이스를 제공합니다. 이 패턴은 서로 다른 팩토리 클래스를 생성하여, 각각 다른 종류의 객체 그룹을 생성할 수 있게 합니다. 이 패턴은 서로 관련 있는 여러 객체들을 일관된 방식으로 생성할 때 유용합니다.

심플 팩토리 패턴의 장,단점

장점

간단한 객체 생성 : 클라이언트는 객체의 생성 과정을 신경 쓰지 않고 간단하게 필요한 객체를 얻을 수 있습니다.
코드 중복 감소 : 객체 생성 코드가 중복되는 것을 방지하고, 한 곳에서 관리할 수 있습니다.
확장성 : 새로운 객체 타입을 추가하기 위해 팩토리 클래스만 수정하면 되므로, 기존 클라이언트 코드의 변경 없이 확장이 가능합니다.

단점

OCP 위반 가능성 : 새로운 객체 타입을 추가할 때마다 팩토리 클래스를 수정해야 하므로, Open/Closed Principle(확장에는 열려 있고, 변경에는 닫혀 있어야 한다는 원칙)을 위반할 수 있습니다.
복잡도 증가 : 생성해야 할 객체가 많아질수록 팩토리 클래스가 복잡해지고, 여러 객체 생성 요구사항을 수용하기 어려워질 수 있습니다.

심플 팩토리 패턴의 구조

구조

1.
팩토리 클래스(Factory Class) : 객체 생성 메소드를 포함하며, 클라이언트의 요청에 따라 적절한 객체를 생성하고 반환합니다.
2.
인터페이스(Interface) / 추상 클래스(Abstract Class) : 생성되는 객체들이 공통적으로 구현해야 하는 인터페이스나 추상 클래스입니다. (이는 선택적일 수 있음)
3.
구체적인 제품 클래스(Concrete Product Classes) : 인터페이스나 추상 클래스를 구현하는 실제 객체들입니다.

심플 팩토리 패턴의 UML

아래는 심플 팩토리의 UML입니다.

심플 팩토리 패턴의 구현

심플 팩토리 패턴의 간단한 구현은 실제 유니티에서 사용할 법한 게임 개발 방식으로 설명하겠습니다.
인터페이스 (Interface)
public interface IEnemy { void Attack(); }
C#
복사
역할 : 이 인터페이스는 '적'이라는 개념에 대한 추상화를 제공합니다. 심플 팩토리 패턴에서 생성될 모든 '적' 객체들은 이 인터페이스를 구현해야 합니다.
이 부분은 심플 팩토리 패턴에서 상속받지 않고 사용할 수 있습니다.
목적 : 다양한 타입의 '적'들이 공통의 인터페이스를 공유함으로써, 클라이언트 코드는 구체적인 '적'의 타입에 대해 알 필요 없이 이 인터페이스를 통해 상호 작용할 수 있습니다.
구체적인 제품 클래스 (Concrete Product Classes)
public class Zombie : IEnemy { public void Attack() { Debug.Log("Zombie Attack"); } } public class Robot : IEnemy { public void Attack() { Debug.Log("Robot Attack"); } }
C#
복사
역할 : ZombieRobot 클래스는 IEnemy 인터페이스를 구현합니다. 이들은 실제 '적' 객체의 구체적인 표현입니다.
목적 : 각 클래스는 '적'의 특정 타입(좀비, 로봇)을 나타내며, 자신만의 고유한 Attack 행동을 정의합니다.
팩토리 클래스 (Factory Class)
public static class EnemyFactory { public static IEnemy CreateEnemy(string type) { switch (type) { case "Zombie": return new Zombie(); case "Robot": return new Robot(); default: throw new ArgumentException("Invalid enemy type"); } } }
C#
복사
역할 : EnemyFactory는 '적' 객체를 생성하는 팩토리입니다. 이 클래스는 클라이언트로부터 요청받은 '적' 타입에 따라 해당하는 구체적인 '적' 객체를 생성합니다.
목적 : 객체 생성 로직을 캡슐화하여, 클라이언트가 객체 생성 메커니즘을 몰라도 됩니다. 클라이언트는 단지 필요한 '적'의 타입을 명시하여 객체를 요청합니다.
클라이언트 코드 (Client Code) 실제 사용 방법
public class Game { void SpawnEnemy() { IEnemy enemy = EnemyFactory.CreateEnemy("Zombie"); enemy.Attack(); } }
C#
복사
역할 : Game 클래스는 클라이언트로서, '적' 객체를 필요로 합니다. 이 클래스는 EnemyFactory를 통해 특정 타입의 '적' 객체를 요청하고, 생성된 객체를 사용하여 게임 로직을 수행합니다.
목적 : 클라이언트는 '적' 객체 생성에 대한 세부사항을 알 필요 없이, 팩토리를 통해 간단하게 필요한 객체를 얻을 수 있습니다. 이를 통해 클라이언트 코드의 유연성과 유지보수성이 증가합니다.