๐ ํฉํ ๋ฆฌ ๋ฉ์๋(Factory Method) ํจํด - ์๋ฒฝ ๋ง์คํฐํ๊ธฐ
Factory Method Pattern
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ๊ฐ์ฒด ์์ฑ์ ๊ณต์ฅ(Factory) ํด๋์ค๋ก ์บก์ํ ์ฒ๋ฆฌํ์ฌ ๋์ ์์ฑํ๊ฒ ํ๋ ์์ฑ ๋์์ธ ํจํด์ด๋ค.
์ฆ, ํด๋ผ์ด์ธํธ์์ ์ง์ new ์ฐ์ฐ์๋ฅผ ํตํด ์ ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋, ์ ํ ๊ฐ์ฒด๋ค์ ๋๋งก์ ์์ฑํ๋ ๊ณต์ฅ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฅผ ์์ํ๋ ์๋ธ ๊ณต์ฅ ํด๋์ค์ ๋ฉ์๋์์ ์ฌ๋ฌ๊ฐ์ง ์ ํ ๊ฐ์ฒด ์์ฑ์ ๊ฐ๊ฐ ์ฑ
์ ์ง๋ ๊ฒ์ด๋ค.
๋ํ ๊ฐ์ฒด ์์ฑ์ ํ์ํ ๊ณผ์ ์ ํ ํ๋ฆฟ ์ฒ๋ผ ๋ฏธ๋ฆฌ ๊ตฌ์ฑํด๋๊ณ , ๊ฐ์ฒด ์์ฑ์ ๊ดํ ์ ์ฒ๋ฆฌ๋ ํ์ฒ๋ฆฌ๋ฅผ ํตํด ์์ฑ ๊ณผ์ ์ ๋ค์ํ๊ฒ ์ฒ๋ฆฌํ์ฌ ๊ฐ์ฒด๋ฅผ ์ ์ฐํ๊ฒ ์ ํ ์ ์๋ ํน์ง๋ ์๋ค.
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด ๊ตฌ์กฐ
- Creator : ์ต์์ ๊ณต์ฅ ํด๋์ค๋ก์, ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ถ์ํํ์ฌ ์๋ธ ํด๋์ค๋ก ํ์ฌ๊ธ ๊ตฌํํ๋๋ก ํจ
- ๊ฐ์ฒด ์์ฑ ์ฒ๋ฆฌ ๋ฉ์๋(someOperartion) : ๊ฐ์ฒด ์์ฑ์ ๊ดํ ์ ์ฒ๋ฆฌ, ํ์ฒ๋ฆฌ๋ฅผ ํ ํ๋ฆฟํํ ๋ฉ์๋
- ํฉํ ๋ฆฌ ๋ฉ์๋(createProduct) : ์๋ธ ๊ณต์ฅ ํด๋์ค์์ ์ฌ์ ์ํ ๊ฐ์ฒด ์์ฑ ์ถ์ ๋ฉ์๋
- ConcreteCreator : ๊ฐ ์๋ธ ๊ณต์ฅ ํด๋์ค๋ค์ ์ด์ ๋ง๋ ์ ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ก ์์ฑ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ค. ์ฆ, ์ ํ ๊ฐ์ฒด ํ๋๋น ๊ทธ์ ๊ฑธ๋ง๋ ์์ฐ ๊ณต์ฅ ๊ฐ์ฒด๊ฐ ์์น๋๋ค.
- Product : ์ ํ ๊ตฌํ์ฒด๋ฅผ ์ถ์ํ
- ConcreteProduct : ์ ํ ๊ตฌํ์ฒด
์ ๋ฆฌํ์๋ฉด, ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ณต์ฅ(Factory ๊ฐ์ฒด)์ ๋ง๋๋ ํจํด์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง๋ ๋ฏธ๋ฆฌ ์ ์ํ ๊ณต์ฅ ์๋ธ ํด๋์ค์์ ๊ฒฐ์ ํ๋ค.
๊ฒจ์ฐ ๊ฐ์ฒด ์์ฑ ๊ฐ์ง๊ณ ์ด๋ฐ์์ผ๋ก ๋ฒ๊ฑฐ๋กญ๊ฒ(?) ๊ตฌ์ฑํ๋ ์ด์ ๋ ๊ฐ์ฒด๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๊ณ ์ ์ง๋ณด์์ ์ฉ์ดํด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ฒด๋ ์ฌ๋ / ์ฌ๋ฌผ๊ณผ ๊ฐ์ ์ ํ์ ํํ๊ฐ ๋ ์๋ ์๊ณ , ์ ๋ต / ์ํ ์ ๊ฐ์ ๋ฌดํ์ ํํ๊ฐ ๋ ์๋ ์๊ณ , ๊ณต์ฅ ๊ณผ ๊ฐ์ ์ค๊ฐ ์์ฑ์ ์ญํ ๋ ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
[ Template Method ํจํด๊ณผ Factory Method ํจํด๊ณผ์ ๊ด๊ณ ]
๋ญ๊ฐ ์ด๋ฆ ๊ตฌ์ฑ์ด ๋น์ทํด์ ๋์ด ์ด๋ ํ ๊ด๊ณ๊ฐ ์์ด ๋ณด์ด๋๋ฐ, ํ ํ๋ฆฟ ๋ฉ์๋๋ ํ๋ ํจํด์ด๊ณ ํฉํ ๋ฆฌ ๋ฉ์๋๋ ์์ฑ ํจํด์ด๋ผ ๋์ ์ ํ ๋ค๋ฅธ ํจํด์ด๋ค.
๋ค๋ง ํด๋์ค ๊ตฌ์กฐ์ ๊ฒฐ์ ๋์ด ๊ฐ๋ค๊ณ ๋ณด๋ฉด ๋๋๋ฐ, ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ณต์ฅ์ Template Method ํจํด์ผ๋ก ๊ตฌ์ฑํ ๊ฒ์ด Factory Method ํจํด์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
Template Method ํจํด์์๋ ํ์ ํด๋์ค์์ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ด์ฉ์ ๋ง๋ค๋๋ก ์ถ์ ๋ฉ์๋๋ฅผ ์์ ์์ผฐ์๋ค. ์ด ๋ก์ง์ ์๊ณ ๋ฆฌ์ฆ ๋ด์ฉ์ด ์๋ ์ธ์คํด์ค ์์ฑ์ ์ ์ฉํ ๊ฒ์ด Factory Method ํจํด ์ธ ๊ฒ์ด๋ค.
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด ํ๋ฆ
ํด๋์ค ๊ตฌ์ฑ
์ ํ(Product) ํด๋์ค
// ์ ํ ๊ฐ์ฒด ์ถ์ํ (์ธํฐํ์ด์ค)
interface IProduct {
void setting();
}
// ์ ํ ๊ตฌํ์ฒด
class ConcreteProductA implements IProduct {
public void setting() {
}
}
class ConcreteProductB implements IProduct {
public void setting() {
}
}
๊ณต์ฅ(Factory) ํด๋์ค
// ๊ณต์ฅ ๊ฐ์ฒด ์ถ์ํ (์ถ์ ํด๋์ค)
abstract class AbstractFactory {
// ๊ฐ์ฒด ์์ฑ ์ ์ฒ๋ฆฌ ํ์ฒ๋ฆฌ ๋ฉ์๋ (final๋ก ์ค๋ฒ๋ผ์ด๋ฉ ๋ฐฉ์ง, ํ
ํ๋ฆฟํ)
final IProduct createOperation() {
IProduct product = createProduct(); // ์๋ธ ํด๋์ค์์ ๊ตฌ์ฒดํํ ํฉํ ๋ฆฌ ๋ฉ์๋ ์คํ
product.setting(); // .. ์ด๋ฐ์ ๊ฐ์ฒด ์์ฑ์ ๊ฐ๋ฏธํ ๋ก์ง ์คํ
return product; // ์ ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ถ๊ฐ ์ค์ ํ๊ณ ์์ฑ๋ ์ ํ์ ๋ฐํ
}
// ํฉํ ๋ฆฌ ๋ฉ์๋ : ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด ์์ฑ ์ข
๋ฅ๋ ๊ฐ ์๋ธ ํด๋์ค์ ์์
// protected ์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์ ๋
ธ์ถ์ด ์๋จ
abstract protected IProduct createProduct();
}
// ๊ณต์ฅ ๊ฐ์ฒด A (ProductA๋ฅผ ์์ฑํ์ฌ ๋ฐํ)
class ConcreteFactoryA extends AbstractFactory {
@Override
public IProduct createProduct() {
return new ConcreteProductA();
}
}
// ๊ณต์ฅ ๊ฐ์ฒด B (ProductB๋ฅผ ์์ฑํ์ฌ ๋ฐํ)
class ConcreteFactoryB extends AbstractFactory {
@Override
public IProduct createProduct() {
return new ConcreteProductB();
}
}
์ต์์ ๊ณต์ฅ ํด๋์ค๋ ๋ฐ๋์ ์ถ์ ํด๋์ค๋ก ์ ์ธํ ํ์ ์๋ค.
Java 8 ๋ฒ์ ์ดํ ์ถ๊ฐ๋ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋๋ฅผ ํตํด ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๋์ค ํ๋ฆ
class Client {
public static void main(String[] args) {
// 1. ๊ณต์ฅ ๊ฐ์ฒด ์์ฑ (๋ฆฌ์คํธ)
AbstractFactory[] factory = {
new ConcreteFactoryA(),
new ConcreteFactoryB()
};
// 2. ์ ํA ์์ฑ (์์์ createProduct() ์ ์์ฑ ํ์ฒ๋ฆฌ ์คํ)
IProduct productA = factory[0].createOperation();
// 3. ์ ํB ์์ฑ (์์์ createProduct() ์ ์์ฑ ํ์ฒ๋ฆฌ ์คํ)
IProduct productB = factory[1].createOperation();
}
}
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด ํน์ง
ํจํด ์ฌ์ฉ ์๊ธฐ
- ํด๋์ค ์์ฑ๊ณผ ์ฌ์ฉ์ ์ฒ๋ฆฌ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ํ ๋
- ์ฝ๋๊ฐ ๋์ํด์ผ ํ๋ ๊ฐ์ฒด์ ์ ํ๊ณผ ์ข ์์ฑ์ ์บก์ํ๋ฅผ ํตํด ์ ๋ณด ์๋ ์ฒ๋ฆฌ ํ ๊ฒฝ์ฐ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํน์ ํ๋ ์์ํฌ ์ฌ์ฉ์์๊ฒ ๊ตฌ์ฑ ์์๋ฅผ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ค๋ ๊ฒฝ์ฐ
- ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๋์ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ
- ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฝ๋๋ ์์ฃผ ์ค๋ณต๋ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ๋ณํ๋ ํด๋น๋๋ ๋ชจ๋ ์ฝ๋ ๋ถ๋ถ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ๋ฐ๋ผ์ ๊ฐ์ฒด์ ์์ฑ ์ฝ๋๋ฅผ ๋ณ๋์ ํด๋์ค / ๋ฉ์๋๋ก ๋ถ๋ฆฌ ํจ์ผ๋ก์จ ๊ฐ์ฒด ์์ฑ์ ๋ณํ์ ๋ํด ๋๋น๋ฅผ ํ๊ธฐ ์ํด ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ์ด์ฉํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
- ํน์ ๊ธฐ๋ฅ์ ๊ตฌํ์ ๋ณ๊ฐ์ ํด๋์ค๋ก ์ ๊ณต๋๋ ๊ฒ์ด ๋ฐ๋์งํ ์ค๊ณ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํจํด ์ฅ์
- ์์ฑ์(Creator)์ ๊ตฌํ ๊ฐ์ฒด(concrete product)์ ๊ฐํ ๊ฒฐํฉ์ ํผํ ์ ์๋ค.
- ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ฒด์ ์์ฑ ํ ๊ณตํต์ผ๋ก ํ ์ผ์ ์ํํ๋๋ก ์ง์ ํด์ค ์ ์๋ค.
- ์บก์ํ, ์ถ์ํ๋ฅผ ํตํด ์์ฑ๋๋ ๊ฐ์ฒด์ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ๊ฐ์ถ ์ ์๋ค.
- ๋จ์ผ ์ฑ ์ ์์น ์ค์ : ๊ฐ์ฒด ์์ฑ ์ฝ๋๋ฅผ ํ ๊ณณ (ํจํค์ง, ํด๋์ค ๋ฑ)์ผ๋ก ์ด๋ํ์ฌ ์ฝ๋๋ฅผ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ํ ์ ์์ผ๋ฏ๋ก ์์น์ ๋ง์กฑ
- ๊ฐ๋ฐฉ/ํ์ ์์น ์ค์ : ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ์๋ก์ด ์ ํ์ ์ ํ ์ธ์คํด์ค๋ฅผ ํ๋ก๊ทธ๋จ์ ๋์ ํ ์ ์์ด ์์น์ ๋ง์กฑ (ํ์ฅ์ฑ ์๋ ์ ์ฒด ํ๋ก์ ํธ ๊ตฌ์ฑ์ด ๊ฐ๋ฅ)
- ์์ฑ์ ๋ํ ์ธํฐํ์ด์ค ๋ถ๋ถ๊ณผ ์์ฑ์ ๋ํ ๊ตฌํ ๋ถ๋ถ์ ๋ฐ๋ก ๋๋์๊ธฐ ๋๋ฌธ์ ํจํค์ง ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ณ๋ก ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ํ์ ์ ํตํด ๊ฐ๋ฐ
ํจํด ๋จ์
- ๊ฐ ์ ํ ๊ตฌํ์ฒด๋ง๋ค ํฉํ ๋ฆฌ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ๊ตฌํํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ๊ตฌํ์ฒด๊ฐ ๋์ด๋ ๋ ๋ง๋ค ํฉํ ๋ฆฌ ํด๋์ค๊ฐ ์ฆ๊ฐํ์ฌ ์๋ธ ํด๋์ค ์๊ฐ ํญ๋ฐํ๋ค.
- ์ฝ๋์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ค.
์์ ๋ฅผ ํตํด ์์๋ณด๋ Factory Method ํจํด
๋ค์ํ ์ ๋ฐ ํฉํ ๋ฆฌ ๊ตฌ์ฑํ๊ธฐ
์์ ๋ก ์ ๋ฐ(Ship) ์ ํ์ ๋ง๋๋ ๋ก์ง์ ๊ตฌ์ฑํ๋ค๊ณ ๊ฐ์ ํ์.
ํด๋ฆฐํ์ง ์์ ๋ฌธ์ ์ ์ฝ๋ โ
๊ฐ์ฅ ์ฌํํ ๋ฐฉ๋ฒ์ Ship ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ๊ฒ์ด๋ค. ๋งค๊ฐ๋ณ์์ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ๊ฐ๊ธฐ ๋ค๋ฅธ ํ์ ์ ์ ๋ฐ๋ ๋ถ๊ธฐ๋ฌธ์ผ๋ก ์์ฑํ๋๋ก ํ์๋ค.
class Ship {
String name, color, capacity;
@Override
public String toString() {
return String.format("Ship { name: '%s', color: '%s', logo: '%s' }", name, color, capacity);
}
}
public static Ship orderShip(String name, String email) {
if (name == null) {
throw new IllegalArgumentException("๋ฐฐ ์ด๋ฆ์ ์ง์ด์ฃผ์ธ์");
}
if (email == null) {
throw new IllegalArgumentException("์ด๋ฉ์ผ์ ๋จ๊ฒจ์ฃผ์ธ์");
}
// ์ ๋ฐ ๊ฐ์ฒด ์์ฑ
Ship ship = new Ship();
// ์ ๋ฐ ๊ฐ์ฒด ์์ฑ ํ์ฒ๋ฆฌ
ship.name = name;
if (name.equalsIgnoreCase("ContainerShip")) {
ship.capacity = "20t";
} else if (name.equalsIgnoreCase("OilTankerShip")) {
ship.capacity = "15t";
}
if (name.equalsIgnoreCase("ContainerShip")) {
ship.color = "green";
} else if (name.equalsIgnoreCase("OilTankerShip")) {
ship.color = "blue";
}
System.out.println(ship.name + " ๋ค ๋ง๋ค์๋ค๊ณ " + email + "๋ก ๋ฉ์ผ์ ๋ณด๋์ต๋๋ค.");
return ship;
}
public static void main(String[] args) {
Ship containerShip = orderShip("ContainerShip", "inpa.naver.com");
System.out.println(containerShip);
Ship oilTankerShip = orderShip("OilTankerShip", "inpa.naver.com");
System.out.println(oilTankerShip);
}
ํ์ง๋ง ์์ ๋ฐฉ๋ฒ์ ํด๋ฆฐํ์ง ์์ ์ฝ๋์ด๋ค.
๋ง์ผ ์ปจํ ์ด๋ ์ ๋ฐ์ด๋ ์ ์กฐ์ ์ธ์ ๋ค๋ฅธ ์ข ๋ฅ์ ์ ๋ฐ๋ค์ด ๊ณ์ ์ถ๊ฐ๊ฐ ๋๋ค๋ฉด ๋ถ๊ธฐ๋ฌธ์ด ์ ํ์ ์ผ๋ก ๋์ด๋ ๋ณต์กํด์ง ๊ฒ์ด๋ค. ๋ํ ํฅํ์ Ship ํด๋์ค ๊ตฌ์ฑ ์์ฒด๊ฐ ๋ณํํ๋ค๋ฉด ๋ถ๊ธฐ๋ฌธ ๋ก์ง๋ ํต์งธ๋ก ๋ฐ๊ฟ์ค์ผ ํ ๊ฒ์ด๋ค.
์ฌํ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ์ ์ฉํ ์ฝ๋ โญ
์ฌํ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ด๋, ๊ฐ์ฒด ์์ฑ์ ๋ด๋นํ๋ ํฉํ ๋ฆฌ ํด๋์ค๋ฅผ ์ฌํํ๊ฒ ํ๋๋ง ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
์๋ ์ฝ๋์ ๊ฐ์ด ์ฐ์ ๊ฐ ์ ๋ฐ ํ์ ์ ๋ฐ๋ฅธ ์ ๋ฐ ๊ฐ์ฒด๋ค์ ์์ ๊ด๊ณ๋ก ๊ตฌ์ฑํด์ฃผ๊ณ , ShipFactory ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ๋ชจ๋ ์ ๋ฐ ๊ฐ์ฒด ์์ฑ์ ์ด ๊ณต์ฅ ํด๋์ค์ ์์ํ๋ค.
// ์ ํ ๊ฐ์ฒด
class Ship {
String name, color, capacity;
@Override
public String toString() {
return String.format("Ship { name: '%s', color: '%s', logo: '%s' }\n", name, color, capacity);
}
}
class ContainerShip extends Ship {
ContainerShip() {
name = "ContainerShip";
capacity = "20t";
color = "green";
}
}
class OilTankerShip extends Ship {
OilTankerShip() {
name = "OilTankerShip";
capacity = "15t";
color = "blue";
}
}
// ๊ณต์ฅ ๊ฐ์ฒด
class ShipFactory {
final Ship orderShip(String name, String email) {
validate(name, email);
Ship ship = createShip(name); // ์ ๋ฐ ๊ฐ์ฒด ์์ฑ
sendEmailTo(email, ship);
return ship;
}
private Ship createShip(String name) {
Ship ship = null;
if (name.equalsIgnoreCase("ContainerShip")) {
ship = new ContainerShip();
} else if (name.equalsIgnoreCase("OilTankerShip")) {
ship = new OilTankerShip();
}
return ship;
}
private void validate(String name, String email) {
if (name == null) {
throw new IllegalArgumentException("๋ฐฐ ์ด๋ฆ์ ์ง์ด์ฃผ์ธ์");
}
if (email == null) {
throw new IllegalArgumentException("์ด๋ฉ์ผ์ ๋จ๊ฒจ์ฃผ์ธ์");
}
}
private void sendEmailTo(String email, Ship ship) {
System.out.println(ship.name + " ๋ค ๋ง๋ค์๋ค๊ณ " + email + "๋ก ๋ฉ์ผ์ ๋ณด๋์ต๋๋ค.");
}
}
class Client {
public static void main(String[] args) {
ShipFactory factory = new ShipFactory();
Ship containerShip = factory.orderShip("ContainerShip", "inpa.naver.com");
System.out.println(containerShip);
Ship oilTankerShip = factory.orderShip("OilTankerShip", "inpa.naver.com");
System.out.println(oilTankerShip);
}
}
ํ์ง๋ง ์๋ฌด๋ฆฌ ๊ฐ์ฒด ์์ฑ์ ๊ณต์ฅ ํด๋์ค๋ก ์์ํ๋๋ผ๋, ๊ณต์ฅ ํด๋์ค ๋ด์์ ์ฌ์ ํ ๋ถ๊ธฐ ๋ก์ง์ด ์์กดํด ์๋ค.
์ฆ, ํ์ฅ์ ์ด๋ ค์๊ณ ์์ ์ ๋ซํ ๊ฐ๋ฐฉ-ํ์ ์์น์ ๋ง์กฑํ์ง ๋ชปํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์๋ก์ด ์ข ๋ฅ์ ๋ฐฐ๋ฅผ ๋ง๋ ๋ค๊ฑฐ๋ ๋ฐฐ๋ฅผ ๋ง๋๋ ๊ณต์ ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉด์๋ ๊ธฐ์กด์ ์์ฑํ๋ ์ฝ๋๋ฅผ ์ ์งํ ์ ์๋ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
๋ง์ผ ์์ฑํ ์ ํ ๊ตฌํ์ฒด๊ฐ ๋ช๊ฐ ์๋๊ณ ์์ผ๋ก๋ ์ ํ ์ข ๋ฅ๊ฐ ์ถ๊ฐ๋์ง ์๋๋ค๋ฉด, ๊ทธ๋ฅ ์ฌํํ๊ฒ ์ฌํ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ผ๋ก ๊ตฌ์ฑํ๋ ๊ฒ๋ ๋์์ง ์์ ๋ฐฉ๋ฒ์ด๋ค.
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ์ ์ฉํ ์ฝ๋ โ๏ธ
์์กดํด ์๋ ๋ถ๊ธฐ๋ฌธ์ ์ ๊ฑฐํ๊ณ ๊ฐ์ฒด ์งํฅ์ผ๋ก ํฉํ ๋ฆฌ๋ฅผ ๊ตฌ์ฑํด๋ณด์.
๋จผ์ ShipFactory ํด๋์ค๋ฅผ ์ถ์ ํด๋์ค๋ก ๋ณํํ๊ณ Ship ์ธ์คํด์ค ์์ฑ์ ์ฑ
์์ง๋ createShip() ๋ฉ์๋๋ฅผ ์ถ์ ๋ฉ์๋๋ก ์ถ์ํ ์ํจ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ ๋ฐ ์ข
๋ฅ์ ๋ง๊ฒ ShipFactory ํด๋์ค๋ฅผ ์์ํ๋ ์๋ธ ํฉํ ๋ฆฌ ํด๋์ค๋ค์ ๋ง๋ค๊ณ createShip() ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ ๊ฐ์ฒด ํน์ง์ ๋ง๊ฒ ์ฌ์ ์ ํ๋๋ก ํ๋ค.
์ฆ, orderShip() ๋ฉ์๋์ ๊ณตํต ์ฝ๋๋ ๋ ๋๊ณ Ship ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์์ ์ฝ๋๋ ์๋ธ ํด๋์ค๊ฐ ๊ฒฐ์ ํ๋๋ก ํ๋ ๊ฒ์ด๋ค. (์ด์ฐ ๋ณด๋ฉด ํ ํ๋ฆฟ ๋ฉ์๋์ ๊ฒฐ์ด ๋น์ทํ๋ค ๋ผ๊ณ ๋ณผ ์ ์๋ค)
๋ํ ๊ณต์ฅ ์์ฑ ๋ฉ์๋ ๋ด๋ถ์์๋ ํ์ํ ๋์์ ์์ ๋กญ๊ฒ ๊ตฌํํ ์ ์๋๋ฐ, ์ธ์๋ฅผ ๋ฐ๊ฑฐ๋ ์ํ์ ๋ฐ๋ผ์ ์์ฑํ ๊ฐ์ฒด๋ฅผ ๋ฐ๊ฟ ์๋ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ข ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ํํ๊ฑฐ๋ ์์ ์ ์ฉ์ดํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ๋ผ ์ ์๋ค
class Ship {
String name, color, capacity;
@Override
public String toString() {
return String.format("Ship { name: '%s', color: '%s', logo: '%s' }\n", name, color, capacity);
}
}
class ContainerShip extends Ship {
ContainerShip(String name, String capacity, String color) {
this.name = name;
this.capacity = capacity;
this.color = color;
}
}
class OilTankerShip extends Ship {
OilTankerShip(String name, String capacity, String color) {
this.name = name;
this.capacity = capacity;
this.color = color;
}
}
abstract class ShipFactory {
// ๊ฐ์ฒด ์์ฑ ์ ์ฒ๋ฆฌ / ํ์ฒ๋ฆฌ ๋ฉ์๋ (์์ ๋ถ๊ฐ)
final Ship orderShip(String email) {
validate(email);
Ship ship = createShip(); // ์ ๋ฐ ๊ฐ์ฒด ์์ฑ
sendEmailTo(email, ship);
return ship;
}
// ํฉํ ๋ฆฌ ๋ฉ์๋
abstract protected Ship createShip();
private void validate(String email) {
if (email == null) {
throw new IllegalArgumentException("์ด๋ฉ์ผ์ ๋จ๊ฒจ์ฃผ์ธ์");
}
}
private void sendEmailTo(String email, Ship ship) {
System.out.println(ship.name + " ๋ค ๋ง๋ค์๋ค๊ณ " + email + "๋ก ๋ฉ์ผ์ ๋ณด๋์ต๋๋ค.");
}
}
class ContainerShipFactory extends ShipFactory {
@Override
protected Ship createShip() {
return new ContainerShip("ContainerShip", "20t", "green");
}
}
class OilTankerShipFactory extends ShipFactory {
@Override
protected Ship createShip() {
return new OilTankerShip("OilTankerShip", "15t", "blue");
}
}
class Client {
public static void main(String[] args) {
// ์ ์ฉ ์ ๋ฐ ์์ฐ ๊ณต์ฅ ๊ฐ์ฒด๋ฅผ ํตํด ์ ๋ฐ์ ์์ฑ
Ship containerShip = new ContainerShipFactory().orderShip("inpa.naver.com");
System.out.println(containerShip);
Ship oilTankerShip = new OilTankerShipFactory().orderShip("inpa.naver.com");
System.out.println(oilTankerShip);
}
}
์ ๋ฐ ํ์ ๋ช ์ ์ ๋ ฅ๊ฐ์ผ๋ก ์ค์ ๋ถ๊ธฐ๋ฌธ์ ํตํด ์ ๋ฐ ์ ํ์ ์์ฑํ๋ ๊ฒ์ด ์๋, ์ ์ฉ ์ ๋ฐ ์์ฐ ๊ณต์ฅ ๊ฐ์ฒด๋ฅผ ํตํด ์ ๋ฐ์ ์์ฑํจ์ผ๋ก์จ, ์์ ์ ๋ซํ์๊ณ ํ์ฅ์ ์ด๋ ค์๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ ์ ์๊ฒ ๋๋ค.
๋ง์ผ BattleShip ์ด๋ผ๋ ์๋ก์ด ์ข ๋ฅ์ ์ ๋ฐ ์ ํ์ ์ถ๊ฐํ๋ค๋ผ๊ณ ๊ฐ์ ํ๋ฉด, ๊ฐ๋จํ๊ฒ ์ ํ ๊ฐ์ฒด์ ๊ณต์ฅ ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฐ ์ ์ํ๊ณ ์์ ์ํค๊ธฐ๋ง ํ๋ฉด ๊ธฐ์กด์ ์์ฑ ํ๋ ์ฝ๋ ์์ ์์ด ํ์ฅ๋๋ค.
// ์ ํ ๊ฐ์ฒด
class BattleShip extends Ship {
BattleShip(String name, String capacity, String color) {
this.name = name;
this.capacity = capacity;
this.color = color;
}
}
// ์ ํ์ ์์ฑํ๋ ๊ณต์ฅ ๊ฐ์ฒด
class BattleShipFactory extends ShipFactory {
@Override
protected Ship createShip() {
return new BattleShip("BattleShip", "10t", "black");
}
}
ํฉํ ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ฑ๊ธํคํ ํ๊ธฐ ๐ ๏ธ
๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ณต์ฅ ๊ฐ์ฒด๋ ์ฌ๋ฌ๊ฐ ์์ ํ์์ฑ์ด ์๋ค.
๋ฐ๋ผ์ ์ฑ๊ธํค ๊ฐ์ฒด๋ก ๊ตฌ์ฑํ์ฌ ์ ์ผํ ์ธ์คํด์ค๋ก ๋ง๋ค์ด ๋๋ ๊ฒ์ด ๋ฒ ์คํธ ์ด์ด์ค์ด๋ค.
๋ฌผ๋ก ์์ ๊ฐ์ด ๋ฉ์๋ ํธ์ถ์ฉ์ผ๋ก ์ผํ์ฉ์ผ๋ก ์ฐ์ธ ์ธ์คํด์ค๋ JVM์ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ์ ์ํด ์๋์ผ๋ก ์ง์์ง์ง๋ง, ์ด๋ฐ ๊ฐ๋น์ง ๊ฐ์ด ๋์ด๋๊ฒ๋๋ฉด ๋์ค์ ๊ฐ์ฒด ์ ๊ฑฐ ๊ณผ์ ์์ Stop-the-world ๊ฐ ์ผ์ด๋๊ฒ ๋๋ค. (ํ๋ก๊ทธ๋จ์ด ๋ ๊ฑธ๋ฆผ)
๋ฐ๋ผ์ ๊ฐ ํฉํ ๋ฆฌ ํด๋์ค๋ค์ ์ฑ๊ธํค(Singleton) ํ ์์ผ ๋ฉ๋ชจ๋ฆฌ ์ ์ผ๋ก ์ต์ ํ๋ฅผ ์ํจ๋ค.
class ContainerShipFactory extends ShipFactory {
// Thread-Safe ํ ์ฑ๊ธํค ๊ฐ์ฒดํ
private ContainerShipFactory() {}
private static class SingleInstanceHolder {
private static final ContainerShipFactory INSTANCE = new ContainerShipFactory();
}
public static ContainerShipFactory getInstance() {
return SingleInstanceHolder.INSTANCE;
}
@Override
protected Ship createShip() {
return new ContainerShip("ContainerShip", "20t", "green");
}
}
class OilTankerShipFactory extends ShipFactory {
// Thread-Safe ํ ์ฑ๊ธํค ๊ฐ์ฒดํ
private OilTankerShipFactory() {}
private static class SingleInstanceHolder {
private static final OilTankerShipFactory INSTANCE = new OilTankerShipFactory();
}
public static OilTankerShipFactory getInstance() {
return OilTankerShipFactory.SingleInstanceHolder.INSTANCE;
}
@Override
protected Ship createShip() {
return new OilTankerShip("OilTankerShip", "15t", "blue");
}
}
class Client {
public static void main(String[] args) {
// ์ ์ฉ ์ ๋ฐ ์์ฐ ๊ณต์ฅ ๊ฐ์ฒด๋ฅผ ํตํด ์ ๋ฐ์ ์์ฑ
Ship containerShip = ContainerShipFactory.getInstance().orderShip("inpa.naver.com");
System.out.println(containerShip);
Ship oilTankerShip = OilTankerShipFactory.getInstance().orderShip("inpa.naver.com");
System.out.println(oilTankerShip);
}
}
์ต์์ ํฉํ ๋ฆฌ๋ฅผ ์ธํฐํ์ด์ค๋ก ๊ตฌ์ฑํ๊ธฐ ๐ ๏ธ
์ต์์ ํฉํ ๋ฆฌ ํด๋์ค๋ ๋ฐ๋์ ์ถ์ ํด๋์ค๋ก ์ ์ธํ ํ์ ์๋ค.
Java 8 ๋ฒ์ ์ดํ ์ถ๊ฐ๋ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋์ Java 9 ๋ฒ์ ์ดํ ์ถ๊ฐ๋ private ๋ฉ์๋๋ฅผ ํตํด ๊ทธ๋๋ก ์ธํฐํ์ด์ค๋ก ๊ตฌ์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
interface ShipFactory {
// java8์ ์ถ๊ฐ๋ ๋ํดํธ ๋ฉ์๋
default Ship orderShip(String email) {
validate(email);
Ship ship = createShip(); // ์ ๋ฐ ๊ฐ์ฒด ์์ฑ
sendEmailTo(email, ship);
return ship;
}
// ํฉํ ๋ฆฌ ์ถ์ ๋ฉ์๋
Ship createShip();
// java9์ ์ถ๊ฐ๋ private ๋ฉ์๋
private void validate(String email) {
if (email == null) {
throw new IllegalArgumentException("์ด๋ฉ์ผ์ ๋จ๊ฒจ์ฃผ์ธ์");
}
}
private void sendEmailTo(String email, Ship ship) {
System.out.println(ship.name + " ๋ค ๋ง๋ค์๋ค๊ณ " + email + "๋ก ๋ฉ์ผ์ ๋ณด๋์ต๋๋ค.");
}
}
์ค๋ฌด์์ ์ฐพ์๋ณด๋ Factory Method ํจํด
Java
๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ฐ๋ผ ๋๋ ๋ฉ์๋์ ๋ฐ๋ผ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํ๋ ๋จ์ํ ๋ฒ์ ์ ํฉํ ๋ฆฌ ํจํด์ผ๋ก์ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅด๋ค.
- java.util.Calendar ์ getInstance()
- java.util.ResourceBundle ์ getBundle()
- java.text.NumberFormat ์ getInstance()
- java.nio.charset.Charset ์ forName()
- java.net.URLStreamHandlerFactory ์ createURLStreamHandler(String)
- java.util.EnumSet ์ of()
- javax.xml.bind.JAXBContext ์ createMarshaller() and other similar methods
NumberFormat์ getInstance()
- ๊ตญ๊ฐ ๋๋ ํํ์ ๋ฐ๋ผ ๋ค๋ฅธ ํํ ๋ฐฉ์์ ์ปค๋ฒํ๊ธฐ ์ํด ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ผ๋ก ๋์์ธ ๋์๋ค.
- NumberFormat์ ๊ตฌํํ๋ ํด๋์ค๋ DecimalFormat, ExponentialFormat ๋ฑ์ด ์๋ค.
public static void main(String[] args) {
// ํฉํ ๋ฆฌ ๋ฉ์๋๋ก ๊ตฌํ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฐํ
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
NumberFormat percentFormatter = NumberFormat.getPercentInstance();
double x = 0.1;
System.out.println(currencyFormatter.format(x)); // $0.10๋ฅผ ์ถ๋ ฅํ๋ค.
System.out.println(percentFormatter.format(x)); // 10%๋ฅผ ์ถ๋ ฅํ๋ค.
}
Calendar์ getInstance()
getInstance()๋ฅผ ํธ์ถํ ๋๋ง๋ค ์๋ก์ด Calendar ๊ฐ์ฒด๊ฐ ์์ฑ- Calendar๋ Gregorian ํ์ Julian ํ์์ด ์๋๋ฐ, ์ด ๋๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ์ปค๋ฒํ๊ธฐ ์ํด ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ผ๋ก ๋์์ธ ๋์๋ค.
public static void main(String[] args) {
// ํฉํ ๋ฆฌ ๋ฉ์๋๋ก ๊ตฌํ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฐํ
System.out.println("Calendar ์์ : ", Calendar.getInstance());
}
Spring Framework
BeanFactory
- Object ํ์ ์ Product ๋ฅผ ๋ง๋๋ BeanFactory ๋ผ๋ Creator
- BeanFactory ๊ฐ Creator ์ธํฐํ์ด์ค์ด๊ณ ์ด๋ฅผ ๊ตฌํํ ClassPathXmlApplicationContext, AnnotationConfigApplicationContext ๊ฐ ConcreteCreator ์ด๋ค.
- ์ฌ๊ธฐ์ ๋๊ฒจ์ฃผ๋ Product ๋ Object ํ์ ์ด๊ณ ์ด๋ฅผ ๋๊ฒจ ๋ฐ๋ ์ธ์คํด์ค๊ฐ ConcreateProduct ๊ฐ ๋๋ค.
- ์ปดํฌ๋ํธ ์ค์บ, bean ์ค์ ์ด๋ ธํ ์ด์ , xml ํ์ผ ๋ฑ์ bean ๋ค์ด ๊ฒฐ๊ตญ ConcreateProduct ์ ํด๋น๋๋ ๊ฒ
- ioc ์ปจํ ์ด๋์ ํด๋น๋๋ ํด๋์ค๊ฐ bean ํฉํ ๋ฆฌ ์ธ๋ฐ ์ด๋ถ๋ถ์ ๋ น์์ ธ ์๋ ํจํด์ด ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ด๋ค.
// ์ปดํฌ๋ํธ ์ค์บ, bean ์ค์ ์ด๋
ธํ
์ด์
, xml ํ์ผ ๋ฑ์ bean ๋ค์ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด ConcreateProduct ๋ฅผ ๋ฐํ
BeanFactory xmlFactory = new ClassPathXmlApplicationContext("config.xml");
String hello = xmlFactory.getBean("hello", String.class);
BeanFactory javaFactory = new AnnotationConfigApplicationContext(Config.class);
String hi = javaFactory.getBean("hi", String.class);
Factory Method ๋ณํ ํจํด
GOF ๋์์ธ ํจํด์ 1995๋ ์ ์ ํํ๋ ์ฝ๋ ํจํด์ด๋ค. ์๋๊ฐ ์ง๋จ์ ๋ฐ๋ผ ์๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ด ์ถ๊ฐ๋์๊ณ ์ด๋ฅผ ์์ฉํด ๊ธฐ์กด์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ข๋ ๊ฐ์ ์ํจ ์ผ์ข ์ GOF ๋ณํ ํจํด์ด ์กด์ฌํ๋ค.
Enum Factory Method ํจํด
ํฉํ ๋ฆฌ ํด๋์ค๋ฅผ ์๋ฐ Enum์ผ๋ก ๊ตฌ์ฑํ ํจํด์ด๋ค.
[GOF+] ๐ Enum Factory Method ๋ณํ ํจํด ์์๋ณด๊ธฐ
Enum Factory Method Pattern Enum Factory Method ๋ณํ ํจํด์ GOF์ Factory Method ํจํด์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํ ํจํด์ด๋ค. Factory Method ํจํด์ ๊ฐ์ฅ ํฐ ๋จ์ ์ ์ ํ ๊ฐ์ฒด์ ๊ฐฏ์๋ง๋ค ๊ณต์ฅ ์๋ธ ํด๋์ค๋ฅผ ๋ชจ๋ ๊ตฌ
inpa.tistory.com
Dinamic Facory ํจํด
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ํฐ ๋จ์ ์ ์ ํ ๊ฐ์ฒด์ ๊ฐฏ์๋ง๋ค ๊ณต์ฅ ์๋ธ ํด๋์ค๋ฅผ ๋ชจ๋ ๊ตฌํํด์ผ๋์ ํด๋์ค ํญ๋ฐ์ด ์ผ์ด๋ ์ ์๋ค๋ ์ ์ธ๋ฐ, ์ด๋ฅผ Reflection API๋ฅผ ์ด์ฉํด ๋์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์๋ธ ํด๋์ค ํญ๋ฐ์ ๋ง๋ ํจํด์ด๋ค.
[GOF+] ๐ Dynamic Factory ๋ณํ ํจํด ์์๋ณด๊ธฐ
Dynamic Factory Pattern Dynamic Factory ๋ณํ ํจํด์ GOF์ Factory Method ํจํด์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํ ํจํด์ด๋ค. ๊ธฐ์กด ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด ์ค๋ฆฌ์ง๋ Factory Method ํจํด์ ๊ฐ์ฅ ํฐ ๋จ์ ์ ์ ํ ๊ฐ์ฒด์ ๊ฐฏ์๋ง๋ค
inpa.tistory.com
๋น์ทํ ๋์์ธ ํจํด ๋น๊ต
Factory Method vs Abstract Factory
- Abstract Factory ํจํด์ Factory Method ํจํด๋ณด๋ค ํ ๋จ๊ณ ๋์ ์ถ์ํ ์์ค์ด๋ค.
- ์ ์ฌ์ ๊ณผ ์ฐจ์ด์ ์ ์กฐํฉํด์ ๋ณตํฉ ํจํด์ ๊ตฌ์ฑํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด | ์ถ์ ํฉํ ๋ฆฌ ํจํด | |
๊ณตํต์ | ๊ฐ์ฒด ์์ฑ์ ์บก์ํํจ์ผ๋ก์จ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ๊ฐ์ถ๊ณ ๋์จํ ๊ฒฐํฉ ๊ตฌ์กฐ๋ฅผ ํ๋ฐฉ | |
์ฐจ์ด์ | ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด ์์ฑ๊ณผ์ ์ ํ์ ๋๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด ๋ชฉ์ | ๊ด๋ จ ์๋ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฒด์ ์ธ ํด๋์ค์ ์์กดํ์ง ์๊ณ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด ๋ชฉ์ |
ํ Factory๋น ํ ์ข ๋ฅ์ ๊ฐ์ฒด ์์ฑ ์ง์ | ํ Factory์์ ์๋ก ์ฐ๊ด๋ ์ฌ๋ฌ ์ข ๋ฅ์ ๊ฐ์ฒด ์์ฑ์ ์ง์. (์ ํ๊ตฐ ์์ฑ ์ง์) | |
์ธ์์ ๋ฐ๋ผ ์์ฑ๋๋ ๊ฐ์ฒด์ ์ข ๋ฅ๊ฐ ๊ฒฐ์ | ์ธ์์ ๋ฐ๋ผ ๊ฐ์ฒด๋ค์ ์์ฑํ๋ Factory์ ์ข ๋ฅ๊ฐ ๊ฒฐ์ . (๋ค์์ Factory ์กด์ฌ) | |
๋ฉ์๋ ๋ ๋ฒจ์์ ํฌ์ปค์ค๋ฅผ ๋ง์ถค์ผ๋ก์จ, ํด๋ผ์ด์ธํธ์ ConcreteProduct ์ธ์คํด์ค์ ์์ฑ ๋ฐ ๊ตฌ์ฑ์ ๋ํ ์์กด์ ๊ฐ์ | ํด๋์ค(Factory) ๋ ๋ฒจ์์ ํฌ์ปค์ค๋ฅผ ๋ง์ถค์ผ๋ก์จ, ํด๋ผ์ด์ธํธ์ ConcreteProduct ์ธ์คํด์ค ๊ตฐ์ ์์ฑ ๋ฐ ๊ตฌ์ฑ์ ๋ํ ์์กด์ ๊ฐ์ |
Factory Method vs Template Method
- ์ฌ์ค ํจํด ์ด๋ฆ์ Method๋ ๋ณธ๋ Template Method ํจํด์์ ์ฐจ์ฉํ ๋จ์ด์ด๋ค.
- ์ด์ฐ ๋ณด๋ฉด Factory Method๋ Template Method์ ํน์ํ์ด๋ค.
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด | ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด | |
๊ณตํต์ | ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์๋ธ ํด๋์ค๊ฐ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ํ ํ๋ฆฟํ ๋ ๋ฉ์๋์์ ๋ก์ง์ ๊ณตํตํ ํ๊ธฐ๋ ํจ |
|
์ฐจ์ด์ | ๊ตฌํํ ๋์์ ๊ฐ์ฒด ์์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ | ๊ตฌํํ ๋์์ ์คํํ ์ ๋ต ์๊ณ ๋ฆฌ์ฆ์ ์ง์ |
# ์ฐธ๊ณ ์๋ฃ
์ฝ๋ฉ์ผ๋ก ํ์ตํ๋ GoF์ ๋์์ธ ํจํด - ๋ฐฑ๊ธฐ์
https://refactoring.guru/ko/design-patterns/factory-method