Template Method ํจํด์ ์์ ํด๋์ค์์ ์ฒ๋ฆฌ์ ๋ผ๋๋ฅผ ๋ง๋ค๊ณ , ํ์ ํด๋์ค์์ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ์ ์ด์ ๋ถ์๋ค๋ฉด, FactoryMethod ํจํด์ ์ธ์คํด์ค ์์ฑ ์ฅ๋ฉด์ ์ ์ฉํ ๊ฒ์ ๋๋ค. FactoryMethod ํจํด์์๋ ์ธ์คํด์ค ์์ฑ ๋ฐฉ๋ฒ์ ์์ ํด๋์ค์์ ๊ฒฐ์ ํ๋, ๊ตฌ์ฒด์ ์ธ ํด๋์ค ์ด๋ฆ๊น์ง๋ ๊ฒฐ์ ํ์ง ์์ต๋๋ค. ๊ตฌ์ฒด์ ์ธ ์ด์ ๋ชจ๋ ํ์ ํด๋์ค์์ ๋ถ์ ๋๋ค.
์ถ์ํ๋ ์์ ํด๋์ค Create์ Product
์๋์ ๋ ํด๋์ค๋ ๊ฐ๊ฐ Creator์ Product๋ผ๋ ๋ ๊ฐ์ง๋ฅผ ์ถ์ํํ ํด๋์ค ์ ๋๋ค. ์ธ๋ถ ๋ด์ฉ์ ๋ณด๋ฉด Factory ํด๋์ค์์๋ Producr๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ฒ์ผ๋ฟ ์ ํํ Product๊ฐ ์ด๋ค๊ฑด์ง ์ ์ ์์ต๋๋ค. ๋ํ ์ด์ธ์ ๋ฑ๋กํ๊ณ , ์์ฑํ๋ ๊ณผ์ ์กฐ์ฐจ ์ ํํ ์ ์ ์์ต๋๋ค.
package part4_factory_method_pattern.framework;
public abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
/***************************************************/
package part4_factory_method_pattern.framework;
public abstract class Product {
public abstract void use();
}๊ตฌ์ฒดํ๋ ํด๋์ค ConcreteProduct์ ConcreteCreator
๋ ํด๋์ค๋ ์์ ํด๋์ค์ ๋ํด์ ๊ตฌ์ฒด์ ์ผ๋ก ์ด์ ๋ถ์ด๋ ํด๋์ค์ ๋๋ค. ๋ ์์ ํด๋์ค๋ฅผ ๊ตฌํํ์ฌ ์ ํํ ํ๋ก๋ํธ๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋ฑ๋กํ๋ ๊ฒ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ์ค๋ช ํฉ๋๋ค.
package part4_factory_method_pattern.id_card_factory;
import part4_factory_method_pattern.framework.Factory;
import part4_factory_method_pattern.framework.Product;
public class IDCardFactory extends Factory {
@Override
public IDCard createProduct(String owner) {
return new IDCard(owner);
}
@Override
public void registerProduct(Product product) {
System.out.println(product + "์ ๋ฑ๋กํ์ต๋๋ค.");
}
}
/*******************************************************/
package part4_factory_method_pattern.id_card_factory;
import part4_factory_method_pattern.framework.Product;
public class IDCard extends Product {
private String owner;
IDCard(String owner) {
System.out.println(owner + "์ ์นด๋๋ฅผ ๋ง๋ญ๋๋ค.");
this.owner = owner;
}
@Override
public void use() {
System.out.println(this + "์ ์ฌ์ฉํฉ๋๋ค.");
}
@Override
public String toString() {
return "[IDCard:" + owner + "]";
}
public String getOwner() {
return owner;
}
}์ด ๋ด์ฉ์ ํ์๊ฐ ์ง์ ์ ๋ฆฌํ๋ฉด์ ์ฝ๊ฐ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด์ด์ ๊ตณ์ด ๋ฐ๋ก ๊ธ์ ์จ๋ด ๋๋ค. FactoryMethod ํจํด์ ์ธ์คํด์ค์ ์์ฑ์ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ๋ค๋ฅธ ํด๋์ค์๊ฒ ์์กดํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋์ ์ด๋ฆ๋ Factory๋ผ๊ณ ๋ถ์ ๊ฒ์ ๋๋ค. Factory๋ผ๋ ๊ฒ ์์ฒด๊ฐ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ฐ์ด๋ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ์ด๋ฆ์ด ์๊ธด ๊ฒ์ ๋๋ค. TemplateMehtod ํจํด์ ๊ตฌํ์ฒด์ ์ ์ฒด์ ์ธ ํ๋ฆ ์์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ค๊ณํด๋๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ถ์ํ๋ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ ๊ทธ๊ฒ์ ๊ตฌํํ๋ค๋ ๋งฅ๋ฝ ์์ฒด๋ ๊ฐ์ง๋ง, ๊ฐ๋ ์ด ์ถ๋ฐํ ๊ทผ๋ณธ์ด ๋ค๋ฅธ ๊ฒ์ ๋๋ค.
TemplateMethod Pattern : ๊ฐ์ฒด์ ๋ฉ์๋ ์ฌ์ฉ์ด๋ ํ๋ฆ์ ๋ฏธ๋ฆฌ ์ค๊ณํด๋๋ ๊ฒ.
FactoryMethod Pattern : ์ธ์คํด์ค ์์ฑ์ ๋ค๋ฅธ ํด๋์ค์๊ฒ ์์กดํ๋ค๋ ๊ฒ.
Factory Method ์ด ๋ค ๊ฐ์ง๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ฒซ ์งธ๋ก Creator์ Product๋ฅผ ๋ง๋๋ ์ถ์ํ๋ ์์ ํด๋์ค์ ๊ทธ ๋ ํด๋์ค๋ฅผ ๊ฐ๊ฐ ๊ตฌํํ๋ ๊ตฌํ์ฒด ConcreteCreator, ConcreteProduct๊ฐ ์์ต๋๋ค. ์์ ์ด์ผ๊ธฐ ํ๋ฏ ๊ด๊ณ ์ ์๊ฐ 1 : 1๋ก ๋์ด ๋ค๋ฅธ ํ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ฑ ์์ ์ง๋ ๊ฒ์ด FactoryMethodํจํด์ ๋๋ค.
์์ ๋ฅผ ๋ณด๋ฉด ์ถ์ํ๋ ๋ ํด๋์ค๋ฅผ ํ๋ ์์ํฌ๋ผ๊ณ ํ๊ณ , ๊ทธ๋ค์ ๊ฐ๊ฐ ์ฌ์ฉํ๋ ๊ฒ์ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ด๋ผ๊ณ ์ค๋ช ํ์ต๋๋ค. ์์ ํ๋ก๊ทธ๋จ์ ๋ด์ฉ์ ๋ณด๋ฉด ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ํ๋ ์์ํฌ์ ์์กดํ์ง๋ง, ํ๋ ์์ํฌ๋ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ์์กดํ์ง ์์ต๋๋ค. ๊ทธ์ Factory๋ผ๋ ์ถ์ํ๋ ํด๋์ค์ Product๋ผ๋ ์ถ์ํ๋ ํด๋์ค๋ก ์๋ก์ ์ด์ฉ๊ณผ ๊ด๊ณ์ ๋ํด์๋ง ์ค๊ณ๋ฅผ ํด์ค ๊ฒ์ด๊ณ , ์ด๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ ๊ฐ๊ฐ์ Factory์ Product๋ฅผ ๊ตฌํํ๋ฉด์ ์ถ์ํ๋ ๋ ํด๋์ค์ ์ด์ฉ๊ณผ ๊ด๊ณ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์จ ๊ฒ์ผ ๋ฟ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ๋ค์ ๋ด์์ค ๊ฒ์ด์ง์.
Factory ๋ฉ์๋๋ฅผ ๋ณด๋ฉด createProduct๋ฅผ ํ ๋ return new Product(owner) ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด๋์ ์ ์์์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ ๋ฐฉ๋ฒ๋ ์๊ณ ์ด๋ ๊ฒ ํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ๊ตณ์ด new Product(owner)๋ฅผ ์ฐ์ง ์์ ๊ฒ์ ์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ Product ํด๋์ค๋ฅผ ํด๋น ์ฝ๋ ๋ด์์
์ผ์ผ์ด ๊ตฌํํ๊ฑฐ๋ ์ถ์ํด๋์ค๋ก ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ถ์ํ๋ผ๋ ๊ฐ๋
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
package part4_factory_method_pattern.framework;
public abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}Template Method ํจํด
FactoryMethod ํจํด์ Template Method ํจํด์ ์ ํ์ ์ธ ์์ฉ์
๋๋ค. ์์ ํ๋ก๊ทธ๋จ์ create ๋ฉ์๋๊ฐ ํ
ํ๋ฆฟ ๋ฉ์๋๋ก
๋์ด ์์ต๋๋ค.
Singleton ํจํด
Creator์ญ์ ๋งก๋ ํด๋์ค๋ ๋๋ถ๋ถ Singleton ํจํด์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋จ ์์์ ์ธ์คํด์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ ํ์๊ฐ ๋ณ๋ก
์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋จ, ์ด ์์ ํ๋ก๊ทธ๋จ์ Singletonํจํด์ผ๋ก ๋์ด์์ง ์์ต๋๋ค.
Composite ํจํด
Product์ญ์ Composite ํจํด์ ์ ์ฉํ ์ ์์ต๋๋ค.
Iterator ํจํด Iterator ํจํด์์ iterator ๋ฉ์๋๊ฐ Iterator ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ Factory Method ํจํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.