์๋ฐ์์๋ new ํค์๋๋ฅผ ํ์ฉํ์ฌ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑ ํจ
๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์์ฒด๊ฐ, ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ณณ๊ณผ ์์ฑ๋๋ ํด๋์ค๊ฐ ์์กด์ ์์ ๋ํ๋
์กฐ๊ฑด์ ๋ฐ๋ผ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ๊ณจ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑ ํ ๋์, ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ณณ์์ ๊ตฌ์ฒด ํด๋์ค ๋ชจ๋์ ์์กดํ๊ฒ ๋จ
Duck duck;
if (someCondtion) {
duck = RubberDuck();
} else {
duck = DecoyDuck();
}
...
์์ ๊ฐ์ ์ฝ๋๊ฐ ๋ง์ ์ง๋ค๋ฉด, RubberDuck / DecoyDuck ์ ์์ฑ์๋ฅผ ์์ ํ์ ๋ ์์ ํด์ผ ํ ๊ณต๊ฐ์ด ๋งค์ฐ ๋ง์์ง๋ฉฐ, ์ด๋ค ๋ก์ง์ ํตํด ๊ฐ์ฒด ์์ฑ์ ํ๊ณ ์๋์ง ์ถ์ ํ๋๊ฒ์ด ์ ๋ง ํ๋ค์ด์ง
๋ฐ๋ผ์, ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ถ๋ถ์ ์บก์ํ ํด์ค ํ์๊ฐ ์์
์์ ์ฝ๋
class Pizza
Pizza orderPizza(String type) {
Pizza pizza;
if (type.eqauls("cheese")) {
pizza = CheesePizza();
} else if (type.eqauls("greek") {
pizza = GreekPizza();
}
...
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
๊ฐ์ฒด ์์ฑ ๋ถ๋ถ์ Factory ๋ผ๋ ๊ฒ์ ํตํด ์บก์ํ๋ฅผ ์งํ
๊ฐ์ฒด ์์ฑ์ ์ฒ๋ฆฌํ๋ ํด๋์ค๋ฅผ Factory๋ผ ์นญํจ
์์ ์ฝ๋
class SimplePizzaFactory {
public Pizza orderPizza(String type) {
if (type.eqauls("cheese")) {
pizza = CheesePizza();
} else if (type.eqauls("greek") {
pizza = GreekPizza();
}
}
}
class Pizza
class PizzaStore {
SimplePizzaFactory simplePizzaFactory;
public PizzaStore(SimplePizzaFactory simplePizzaFactory) {
this.simplePizzaFactory = simplePizzaFactory;
}
Pizza orderPizza(String type) {
Pizza pizza = simplePizzaFactory.orderPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
SimplePizzaFactory๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์ด ๋ง์ผ๋ฉด ๋ง์์๋ก ์ ์ฝ๋๊ฐ ์ง์ ์์ฑํ๋๊ฒ๋ณด๋ค ์ ์ง๋ณด์์ ์์ด ํจ์ฌ ์ ๋ฆฌ ํจ
ํผ์๋ฅผ ์์ฑํ๋ ์์ ์ ํ ํด๋์ค์ ์บก์ํ๋ฅผ ์์ผ ๋์ ๊ฒ
ํผ์ ์ข ๋ฅ๋ฅผ ์ถ๊ฐ / ์ ๊ฑฐ ํด์ผ ํ๋ ๊ฒฝ์ฐ, ํฉํ ๋ฆฌ ํด๋์ค๋ง ๊ณ ์น๋ฉด ๋จ
ํผ์์ง ( PizzaStore )๋ฅผ ๋ด์, ์์นด๊ณ ์๋ ๋ฐ์นญํ๊ณ ์ ํจ
๋ฐ๋ผ์, PizzaStore๋ฅผ ์์ํ๋ ๋ค๋ฅธ ํผ์์ง์ ๋ง๋ค์ด์ผ ํจ
์์ฒ๋ผ simple Factory๋ฅผ ํ์ฉ ํ ๋์ ๋ด์ ํผ์ ๊ฐ๊ฒ๋ฅผ ๋ง๋ค ๋์๋ simplePizzaFactory์ ๋ด์ Factory๊ฐ ์ ํํ๊ฒ ์์ผ๋ง ๋์์ ์ ํจ
ํ์ง๋ง, ๊ฐ์ ์ฑ์ด ๋ถ์กฑํ๋ฏ๋ก ์ค์๊ฐ ์์ ์ ์์
๋ฐ๋ผ์ pizza๋ฅผ ๋ง๋๋ method๋ฅผ ์์ ํด๋์ค์์ ๊ตฌํํ๋๋ก ๊ตฌํ
abstract class PiazzaStore {
public Pizza orderPizza(String type) {
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type)
}
Pizza ํด๋์ค ๊ตฌํ
abstract class Pizza {
String name;
Stirng dough;
...
void prepare() {
... // ํผ์ ์ฌ๋ฃ ์ค๋น
}
...
}
class NYStyleCheesePizza extends Pizza {
public NYStyleCheesePizza() {
name = "๋ด์ ์คํ์ผ ์น์ฆ ํผ์"
dough = "์์ ๋์ฐ"
...
}
}
ํผ์์ ๋ค์ด๊ฐ๋ ์์ฌ๋ฃ๋ค์ Factory๋ก ๊ด๋ฆฌํ๊ณ ์ ํจ ( ์ถ์ ํฉํ ๋ฆฌ ํจํด ํ์ฉ )
interface PizzaIngredientFactory {
Dough createDough();
Sauce createSauce();
...
}
class NYPizzaIngredientFactory extends PizzaIngredientFactory {
// ์ค์ ๊ตฌํ ...
}
ํผ์ ํด๋์ค ๋ณ๊ฒฝ
abstract class Pizza {
String name;
Stirng dough;
...
abstract void prepare() // ์ด ๋ถ๋ถ์ Factory๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ ธ์ด
...
}
class CheesePizza extends Pizza {
PizzaIngredientFactory pizzaIngredientFactory;
public CheesePizza(PizzaIngredientFactory pizzaIngredientFactory) {
this.pizzaIngredientFactory = pizzaIngredientFactory;
}
public CheesePizza() {
dough = pizzaIngredientFactory.createDough(); // Factory ํ์ฉํ์ฌ ์ฌ๋ฃ ๊ฐ์ ธ์ด
...
}
}
class NYPizzaStore extends PizzaStore {
protected Pizza createPizza(String item) {
Pizza pizza;
PizzaIngredientFactory ingredeintFactory = new NYPizzaIngredientFactory();
if (item.eqauls("cheese") {
pizza = new CheesePizza(ingredeintFactory);
} else if ...
return pizza;
}
}