문제

나는 간단한 이유 때문에 공장을 사용한 적이 없으며, 언제 필요한 공장을 이해하지 못합니다. 나는 여가 시간에 작은 게임을하고 있었고, 소리를 위해 FMOD를 구현하기로 결정했습니다. 나는 Openal (다른 사운드 설정)을 위해 설계된 래퍼를 보았고 ...처럼 보였습니다.

soundObject* soundObjectManager* soundObjectFactory*

SoundObject는 기본적으로 각 사운드 객체의 인스턴스였습니다. SoundObjectManager는 이러한 모든 객체를 관리합니다. 이것은 직접적으로 충분히 의미가 있지만 많은 의미가 있지만 공장이하는 일이나 사용되는 일을 얻지 못합니다. 나는 공장에서 읽고 있었지만 여전히 그것들을 얻지 못합니다.

모든 도움이 감사하겠습니다!

도움이 되었습니까?

해결책

공장을 "가상 생성자"로 생각하십시오. 공통 컴파일 타임 유형이지만 다른 런타임 유형으로 객체를 구성 할 수 있습니다. 공장에 다른 런타임 유형의 인스턴스를 만들도록 공장에 알려 주면 동작을 전환 할 수 있습니다.

다른 팁

공장은 구현을 매개 변수화해야 할 때 사용됩니다. FMOD는 크로스 플랫폼이며 플랫폼에 어떤 구체적인 구현을 제공 해야하는지 결정해야합니다. 그것이 공장이하는 일입니다. 두 가지 주요 패턴이 있습니다 추상 공장 패턴 그리고 공장 방법 패턴.

가상의 상황 : 여러 플랫폼에서 실행하고 싶은 사운드 라이브러리를 쓰고 있습니다. 나는 가능한 한 많은 코드를 플랫폼 독립적으로 만들려고 노력하지만, 일부는 Windows 대 OSX 대 Linux에 대한 변경이 필요할 것입니다.

그래서 나는이 모든 다른 구현을 작성하지만 최종 사용자가 만들기를 원하지 않습니다. 그들의 프로그램은 Linux 또는 Windows 등에 따라 다릅니다. 또한 API에 4 개의 다른 인터페이스를 유지하고 싶지 않습니다. (이것은 공장을 만들 수있는 이유 중 일부일뿐입니다. 확실히 다른 상황이 있습니다).

그래서 나는이 멋진 제네릭을 정의합니다 SoundObject 클라이언트가 사용하는 모든 방법을 정의하는 기본 클래스. 그럼 나는 내 것이다 LinuxSoundObject, WindowsSoundObject, 5 명은 다른 5 명이 파생됩니다 SoundObject. 그러나 나는이 모든 구체적인 구현을 사용자로부터 숨기고 그들에게만 제공 할 것입니다. SoundObject. 대신, 당신은 내 전화를해야합니다 SoundObjectFactory 당신에게 보이는 것을 평범한 늙음으로 잡기 위해 SoundObject, 그러나 실제로 나는 당신을 위해 올바른 런타임 유형을 선택하고 직접 인스턴스화했습니다.

2 년 후, 새로운 OS가 나오고 창을 대체합니다. 소프트웨어를 다시 쓰도록 강요하는 대신 새로운 플랫폼을 지원하기 위해 내 라이브러리를 업데이트하면 인터페이스의 변경이 보이지 않습니다.

이것은 모두 꽤 고안되었지만, 당신이 아이디어를 얻을 수 있기를 바랍니다.

공장은 인터페이스의 소비자를 실제로 런타임 유형 (IE 구현)에서 분리하는 것입니다.

공장은 제어 역전을 구현하고 구성 요소의 논리에서 인스턴스화 코드 ( 'New')를 분리하는 데 사용될 수 있습니다. 테스트 된 객체가 다른 객체를 만들기를 원하지 않기 때문에 단위 테스트를 작성할 때 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top