๐ 01. Factory Method๋?
๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง๋ฅผ ์๋ธ ํด๋์ค๊ฐ ์ ํ๋ ํจํด์ ๋งํ๋ค.
- ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์, ๊ธฐ๋ฅํน์ ์ญํ ์ ๋ฐ๋ฅธ ๋ค์ํ ๊ตฌํ์ฒด๊ฐ(Product) ๊ฐ ์กด์ฌํ๊ณ , ๊ทธ ์ค์์ ํน์ ํ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๋ค์ํ ํฉํ ๋ฆฌ(Creator)๋ฅผ ์ ๊ณตํ ์ ์๋ค.
<ํด๋์ค ๊ตฌ์กฐ๋>
๐ 02. Factory Method ํจํด ์์
- ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ๋ชฉ์ ์ "๋ณ๊ฒฝ์๋ ๋ซํ์๊ณ , ํ์ฅ์๋ ์ด๋ ค์๋ ๊ตฌ์กฐ" ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค. ์ฆ, OCP ์์น์ ์งํค๊ธฐ์ํ ํจํด์ ๊ฐ๊น๋ค.
01. Factory Method ์ฌ์ฉ ์
ship.class
Factory.class
-> ํด๋ผ์ด์ธํธ์์ white ship์ ๋ง๋ค๊ฒ์ธ๊ฐ, black ship์ ๋ง๋ค ๊ฒ์ธ๊ฐ์ ๋ฐ๋ผ ๋ฐํ๋๋ ship ์ด ๋ฌ๋ผ์ง๋ ์ฝ๋์ด๋ค.
-> Factory ๋ฅผ ํตํด ์๊ตฌ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ Ship ๊ฐ์ฒด๊ฐ ๋ฐํ๋์ง๋ง, ๋ง์ฝ ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด Factory ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋์ด์ผ๋ง ํ๋ค.
๐ก ์ฆ ์ด ์ฝ๋๋, ๋ณ๊ฒฝ์ ๋ซํ์์ง ์์ ์ฝ๋์ธ ๊ฒ์ด๋ค!
02. Factory Method ์ฌ์ฉ ํ
- ๋จผ์ ๋ฐฐ๋ฅผ๋ง๋๋, Factory ๋ฅผ Interface ๋ก ๊ตฌํํ์.
- ๊ธฐ์กด์ ShipFactory์์ ์งํํ๋ validate๋ ShipFactory๋ก ํ๋ฉฐ, ๋ฐฐ๋ฅผ ์ง์ ์ ์ผ๋ก ์์ฑ์ํค๋ createShip( ) ๋ฉ์๋๋ง ์ถ์๋ฉ์๋๋ก ์ ์ํ์.
-> createShip( )์ด Factory Method( )๊ฐ ๋๋ค!
- ๊ทธ ๋ค์, ์ง์ ์ ์ผ๋ก ๋ฐฐ๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ createShip() ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๊ตฌํ์ฒด๋ฅผ ๊ฐ๊ฐ ์ฑ
์์ ๋ง๊ฒ ์ ์ํ์.
-> ship๊ณผ ๊ทธ ๊ตฌํ์ฒด๋ค(whiteship, blackship)์ด Factory๊ฐ ์์ฐํด ๋ผ Product๊ฐ ๋๋ค!
-> Product๋ ์ธํฐํ์ด์ค์ฌ๋ ์๊ด์๊ณ ship๊ณผ ๊ฐ์ด ํด๋์ค์ฌ๋ ์๊ด์๋ค.
- ํด๋ผ์ด์ธํธ์์ ๋ง๋ค ๋ฐฐ์ ๋ฐ๋ผ์, ํด๋นํ๋ ๊ตฌํ์ฒด๋ฅผ ์ ํํ์.
๐๐ป ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์, ๋ค์ RedShip, BludShip ๋ฑ,, ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์์ํด ์ถ๊ฐ์ ์ธ ๋ฐฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผํด๋, ๊ธฐ์กด์ฝ๋๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ, createShip()๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๊ตฌํ์ฒด๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
์ฆ ๋ณ๊ฒฝ์๋ ๋ซํ์๊ณ , ํ์ฅ์๋ ์ด๋ ค์๋ OCP ๋ฅผ ์งํค๋ ๊ตฌ์กฐ๊ฐ ๋๋ค.
โ ํด๋ผ์ด์ธํธ์ ๋ณ๊ฒฝ๋ ์ต์ํ๊ณ ์ถ๋ค๋ฉด, ๊ตฌํ์ฒด๋ฅผ ์ ํํ๋ ๊ณ์ธต์ ํ๋ ๋ ๋๊ฑฐ๋, ์ธ๋ถ์์ ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
๋ฐ๊ฑฐ๋ ํ๋ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝ์ ํ๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
cf) interface์ private method๋ ์๋ฐ 9์ดํ๋ถํฐ ๋ง๋ค์ด์ก๋ค.
์๋ฐ 9์ด์ ์ ๋ฒ์ ์ด๋ผ๋ฉด private๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๊น?
-> ShipFactory interface๋ฅผ ์์๋ฐ๋ abstract class๋ฅผ ์ค๊ฐ๊ณ์ธต์ ๋ง๋ค์ด์ private์ ํด๋นํ๋ ๋ถ๋ถ์ ๊ตฌํํ๊ณ WhiteShipFactory๋ ShipFactory๋ฅผ ์์๋ฐ๋ ๊ฒ์ด ์๋๋ผ abstract class๋ฅผ ์์๋ฐ์ ํ ๊ตฌํํ๋ฉด ๋๋ค!
๐ 03. Factory Method ์ฅ๋จ์
- ์๊ตฌ์ฌํญ์ ๋ณ๊ฒฝ์๋ ๊ธฐ์กด์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ํ์ฅํ์ฌ ์ฒ๋ฆฌํ ์ ์๋ ๋ณด๊ธฐ์ข์ ๊ตฌ์กฐ๊ฐ ๋๋ค.
์ด๋, product์ creater๊ฐ์ ๊ด๊ณ๋ฅผ ๋์คํ ๊ฒฐํฉ์ผ๋ก ๋ฌถ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
- ๊ฐ์์ ์ญํ ์ ๊ฐ์ง๊ณ ์๋ ํด๋์ค๊ฐ ๋์ด๋๊ฒ ๋๋ค. (๊ด๋ฆฌ ํฌ์ธํธ์ ์ฆ๊ฐ)
๐ ์ง๋ฌธ!!
- ํ์ฅ์ ์ด๋ ค์๊ณ ๋ณ๊ฒฝ์ ๋ซํ์๋ ๊ฐ์ฒด ์งํฅ ์์น์ ์ค๋ช
ํ์ธ์.
- ๋ณ๊ฒฝ์ ๋ซํ์๋ค : ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
- ํ์ฅ์ ์ด๋ ค์๋ค : ์๋ก์ด ์ฝ๋(๊ธฐ๋ฅ)๋ฅผ ์ผ๋ง๋ ์ง ํ์ฅํ๋ค.
- ์๋ฐ 8์ ์ถ๊ฐ๋ default ๋ฉ์๋์ ๋ํด ์ค๋ช
ํ์ธ์.
- ๊ธฐ์กด ์๋ฐ ๋ฒ์ ์์๋ interface ์๋ ์ถ์๋ฉ์๋๋ง์ด ์ ์ธ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ฒด์์ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ด์ผ ํ๋ค.
- ์๋ฐ 8 ์ดํ์ ์ถ๊ฐ๋ default ๋ฉ์๋๋ ๊ตฌํ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ์์๋ฐ์ ํด๋์ค๋ ์ธํฐํ์ด์ค์์ ๊ตฌํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ๋ ๋ง๋ค์๋ค.
- ์ดํ ์๋ฐ 9 ์ดํ์ ๋ง๋ค์ด์ง private๋ ์ฌ์ฉํ๋ ์ชฝ์์ ๊ตฌํ๋ฐฉ๋ฒ์ ์ ์ ์๋๋ก ๋ง๋ค์๋ค.
์ฐธ๊ณ ์๋ฃ)
https://thalals.tistory.com/402 - ํ์ฐจ๊ฒ, ์ด์ฌํ ๊ณต๋์