GoF์ ๋์์ธ ํจํด, ์ฒซ๋ฒ์งธ ์ถ์ ํฉํ ๋ฆฌ ํจํด์ ๋ํด ์์๋ณธ๋ค.
ํด๋น ๊ธ์, ๋ค์์ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ดํดํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค.
ํต์ฌ ์์ฝ
Factory์ ์ถ์ํ๋ฅผ ํตํด ์ฌ๋ฌ ์ ํ๊ตฐ์ ๋ง๋ ํ์ Component๋ฅผ ๋ง๋๋ Factory๋ฅผ ์ฌ๋ฌ๊ฐ ๋ง๋ค์ด ๋ณํ์ ์ฝ๊ฒ ๋์ํ ์ ์๋๋ก ํ ํจํด
- ์๋ก ๋ค๋ฅธ ์ ํ๊ตฐ (OS์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ)์ ๋ง๋ค ๋ ์ฉ์ดํ๋ค.
- ๊ณตํต Component๋ฅผ ์์ฑํ๋ Factory๋ฅผ ์ถ์ํํ์ฌ ๋๋ค.
- ์ค์ Factory์์๋ ์ด๋ฅผ ๊ตฌํํ๊ณ ์์ ์ ์ ํ๊ตฐ์ ๋ง๋ ๊ตฌํ์ฒด๋ฅผ ๋ฐํํ๋ค.
- ์๋ก์ด ์ ํ๊ตฐ์ ๋ํด ๊ฐ๋ฐํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฆ๊ฐ์ ์ผ๋ก ๋์ํ ์ ์๋ค.
- ํด๋น API๋ฅผ ๋ฐ์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ์ญ์, ์ถ์ํ๋ Component๋ง์ ๋ณด๊ณ ์์ ์ ์ด์ด๋๊ฐ ์ ์์ด ํธ๋ฆฌํ๋ค.
- ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก โKitโ๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
๋๊ธฐ
- ๊ฐ์ ํ๋ก์ ํธ์์ ์ฌ๋ฌ ์ ํ๊ตฐ์ ๋ง๋ค์ด์ผ ํ๋ค๋ฉด ์ด๋จ๊น?
- ์๋ฅผ ๋ค์ด ๊ฐ์ ํ๋ก๊ทธ๋จ์ด๋ ์น, ์๋์ฐ, ๋งฅ, ๋ฆฌ๋ ์ค์ ๊ฐ์ด ๋ค์ํ ํ๊ฒฝ์์ ์ ๊ณต๋์ด์ผ ํ๋ค๋ฉด?
ํ์ฉ์ฑ
- ๊ฐ์ฒด์ ์์ฑ, ๊ตฌ์ฑ, ํํ ๋ฐฉ์๊ณผ ๋ฌด๊ดํ๊ฒ ์์คํ ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ง๋ค๊ณ ์ ํ ๋
- ์ฌ๋ฌ ์ ํ๊ตฐ ์ค ํ๋๋ก ์์คํ ์ ์ค์ ํด์ผ ํ๊ณ , ํ๋ฒ ๊ตฌ์ฑํ ์ ํ์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋์ฒดํ ์ ์์ ๋
- ๊ด๋ จ๋ ์ ํ ๊ฐ์ฒด๋ค์ด ํจ๊ป ์ฌ์ฉ๋๋๋ก ์ค๊ณ๋์๊ณ , ์ด ์ ์ฝ์ด ์ธ๋ถ์์๋ ์ง์ผ์ง๊ณ ์ถ์ ๋
๊ตฌ์กฐ
- ์๋์ฐ, ๋ฆฌ๋ ์ค ํ๊ฒฝ์ ๋ง์ถ์ด, Button, TextEdit, CheckBox UIComponent๋ฅผ ์์ฑํ๋ ์์๋ฅผ ๋ค์ด๋ณธ๋ค.
์ฐธ์ฌ์
- AbstractFactory(
ComponentFactory
): ๊ฐ๋ ์ ์ ํ์ ๋ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฐ์ฐ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ์ ์ํจ - ConcreteFactory(
WindowsFactory
,LinuxFactory
): ๊ตฌ์ฒด์ ์ธ ์ ํ์ ๋ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฐ์ฐ์ ๊ตฌํํจ - AbstractProduct(
Button
,CheckBox
,TextEdit
): ๊ฐ๋ ์ ์ ํ ๊ฐ์ฒด์ ๋ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํจ - ConcreteFactory(
WindowsButton
,LinuxButton
): ๊ตฌ์ฒด์ ์ผ๋ก ํฉํ ๋ฆฌ๊ฐ ์์ฑํ ๊ฐ์ฒด๋ฅผ ๊ตฌํํจ - Client: AbstractFactory์ AbstractProduct์ ์ ์ธ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํจ
ํ๋ ฅ ๋ฐฉ๋ฒ
- ConcreteFactory ์ธ์คํด์ค ํ๊ฐ๊ฐ ๋ฐํ์์ ๋ง๋ค์ด์ง
- ConcreteFactory์์๋ ํน์ ๊ตฌํ์ ๊ฐ๋ ์ ํ ๊ฐ์ฒด๋ฅผ ์์ฑํจ
- ์๋ก ๋ค๋ฅธ ์ ํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ConcreteFactory ์์ฒด๋ฅผ ๋ณ๊ฒฝํด์ผ ํจ
- AbstractFactory๋ ์ด๋ค ์ ํ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋์ง์ ๋ํ ์ฑ ์์ ConcreteFactory๋ก ์์ํจ
๊ฒฐ๊ณผ
Pros
- ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํ๋ค.
- ์ถ์ ํฉํ ๋ฆฌ ์ธํฐํ์ด์ค๋ฅผ ํตํด์๋ง ์ธ์คํด์ค๋ฅผ ์กฐ์ํ๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฒด ํฉํ ๋ฆฌ ๊ตฌํ์์ ๋ถ๋ฆฌ๋๋ค.
- ์ ํ๊ตฐ์ ์ฝ๊ฒ ๋์ฒดํ ์ ์๋ค.
- ์ด๋ค ๊ตฌ์ฒด ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋์ ๋ฐ๋ผ ์ ํ๊ตฐ์ ํ๋ฒ์ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์ ํ ์ฌ์ด์ ์ผ๊ด์ฑ์ ์ฆ์ง์ํจ๋ค.
- ํ๋์ ๊ตฌ์ฒด ํฉํ ๋ฆฌ์์ ๊ทธ ๋งฅ๋ฝ์ ๋ง๋ ๊ฐ์ฒด๋ค์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ผ๊ด์ฑ์ด ์๊ธด๋ค.
Cons
- ์๋ก์ด ์ข
๋ฅ์ ์ ํ์ ์ ๊ณตํ๊ธฐ ์ด๋ ต๋ค.
- ๋ง์ฝ macOS์์๋ง imageView๋ฅผ ์ ๊ณตํ๋ค๊ณ ํ์.
- ์ถ์ ํด๋์ค์ createImageView๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด, ๋ค๋ฅธ ์ ํ๊ตฐ์์๋ ์ด๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
- ๋ฌผ๋ก ๋ฐฉ๋ฒ์ ์์ง๋ง ์ผ๋จ์..
- ์ฆ, ์์ฑ๋๋ ์ ํ์ ์ถ์ ํฉํ ๋ฆฌ๊ฐ ์์ฑํ ์ ์๋ ์ ํ ์งํฉ์ ๊ณ ์ ๋์ด ์๋ค.
- ํน์ ๋ฐํ๋๋ ํ์ ์ด ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฅผ ์ฑํ(ํน์ ์ธ์ด์๋ฐ๋ผ ์์)๋ฐ๋ ์๋ธ ํด๋์ค ๋ชจ๋ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
์์
- Github: DesignPattern: AbstractFactory์์ commit์ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ฝ์ผ๋ฉด ๋์์ด ๋๋ค.
- ๋ง์ฝ ์๋ก์ด ์ ํ๊ตฐ(MacOS)๊ฐ ์ถ๊ฐ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
- ์ด์ ๊ฐ์ด ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค. ํ๊ฒฝ์ ๋ ๋ฆฝ์ ์ธ ์์คํ ์ด ๊ฐ์ถ์ด์ก๋ค.
์ ์๋ ค์ง ์ฌ์ฉ์
- โKitโ์ด๋ผ๋ ๋จ์ด๋ฅผ ํ๋ ์์ํฌ์์ ๋ค์ด๋ณด์๋ค๋ฉด, ์ด๋ ๊ฒ ๊ตฌํ๋์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ์ฆ, OOKit์ ์ถ์ ํฉํ ๋ฆฌ ํด๋์ค์ด๋ค.
๊ด๋ จ ํจํด
- AbstractFactory ํด๋์ค๋ 06. Factory Method pattern์ ์ด์ฉํ์ฌ ๊ตฌํ๋๋ค.
- 07. Prototype์ ์ด์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
- ConcreteFactory๋ 08. Singleton์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.