๋ฐ์ํ
Factory Method
Factory Method ํจํด
๐ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ณต์ฅ์ Template Method ํจํด์ผ๋ก ๊ตฌ์ฑํ ๊ฒ
- ์ธ์คํด์ค์ ์์ฑ ๋ฐฉ๋ฒ์ ์์ ํด๋์ค์์ ๊ฒฐ์ ํ๋, ๊ตฌ์ฒด์ ์ธ ํด๋์ค ์ด๋ฆ๊น์ง ๊ฒฐ์ ํ์ง ์์
- ๊ตฌ์ฒด์ ์ธ ์ด์ ๋ชจ๋ ํ์ ํด๋์ค์์ ๊ฒฐ์ !
⇒ ์ธ์คํด์ค ์์ฑ์ ์ํ ํ๋ ์์ํฌ์ ์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ํด๋์ค๋ฅผ ๋๋ ์ ์์
๋ฑ์ฅ์ธ๋ฌผ
Product (์ ํ)
- ํ๋ ์์ํฌ package
- ์์ฑ๋๋ ์ธ์คํด์ค๊ฐ ๊ฐ์ ธ์ผ ํ ์ธํฐํ์ด์ค(API)๋ฅผ ๊ฒฐ์ ํ๋ ์ถ์ ํด๋์ค
- ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ํ์ ํด๋์ค `ConcreteProduct` ์์ ๊ฒฐ์
package framework;
public abstract class Product {
public abstract void use();
}
Creator (์์ฑ์)
- ํ๋ ์์ํฌ package
- Product๋ฅผ ์์ฑํ๋ ์ถ์ ํด๋์ค
- ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ํ์ ํด๋์ค `ConcreateCreato`r ์์ ๊ฒฐ์
- ์ค์ ๋ก ์์ฑํ `ConcreateProduct` ์๋ ์ฐ๊ฒฐ์ฑ์ด ์์ → ์ธ์คํด์ค ์์ฑ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด Product๊ฐ ์์ฑ๋๋ค๋ ๊ฒ๋ง ์๋ ์ํ
- ๐`new` ๋ฅผ ์ฌ์ฉํด ์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํจ์ผ๋ก์จ ๊ตฌ์ฒด์ ์ธ ํด๋์ค ์ด๋ฆ์ ์ํ ์๋ฐ์์ ์์ ํด๋์ค๋ฅผ ์์ ๋กญ๊ฒ ํจ
- ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ Template Method ํจํด์ ์ฌ์ฉ
package 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);
}
ConcreateProduct (๊ตฌ์ฒด์ ์ธ ์ ํ)
- ๊ตฌ์ฒด์ ์ผ๋ก ์ด์ ๋ถ์ด๋ ์ชฝ
- ๊ตฌ์ฒด์ ์ธ ์ ํ์ ๊ฒฐ์
package idcard;
import 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() {...}
public String getOwner() {
return owner;
}
}
ConcreateCreator (๊ตฌ์ฒด์ ์ธ ์์ฑ์)
- ๊ตฌ์ฒด์ ์ผ๋ก ์ด์ ๋ถ์ด๋ ์ชฝ
- ๊ตฌ์ฒด์ ์ธ ์ ํ์ ๋ง๋ค ํด๋์ค๋ฅผ ๊ฒฐ์
package idcard;
import framework.Factory;
import framework.Product;
public class IDCardFactory extends Factory {
@Override
protected Product createPRoduct(Stirng owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(Product product) {
System.out.println(product + "๋ฅผ ๋ฑ๋กํ์์ต๋๋ค")
}
}
ํ๋ ์ ์ํฌ์ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ
- framework ํจํค์ง๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์ ํ ๋ค๋ฅธ ‘์ ํ’๊ณผ ‘๊ณต์ฅ’์ ๋ง๋ค ์ ์์
- ex) TV ํด๋์ค๋ฅผ ๋ง๋ค ๊ฒฝ์ฐ, framework ํจํค์ง๋ฅผ import ํ๋ Television๊ณผ TelevisionFactory๋ฅผ television ํจํค์ง์ ์์ฑ
- ๐ framework ํจํค์ง๋ idcard ํจํค์ง์ ์์กดํ์ง ์๋๋ค!
์ธ์คํด์ค ์์ฑ - ๋ฉ์๋ ๊ตฌํ ๋ฐฉ๋ฒ
์ถ์ ๋ฉ์๋๋ก ๊ธฐ์
- ํ์ ํด๋์ค์์ ๋ฐ๋์ ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํจ!
abstract class Factoray {
public abstract Product createProduct(String name);
}
๋ํดํธ ๊ตฌํ์ ์ค๋น
- ํ์ ํด๋์ค์์ ๊ตฌํํ์ง ์์ ๊ฒฝ์ฐ ๋ํดํธ ๊ตฌํ์ด ์ฌ์ฉ
- new๋ฅผ ์คํํ๋ฏ๋ก Product๋ฅผ ์ถ์ ํด๋์ค๋ก ๋ ์ ์์
class Factory {
public Product createProduct(String name) {
return new Product(name);
}
}
๐ก์ฐ์ต ๋ฌธ์ Insight
public class IDCard extends Product {
IDCard (String owner) {...}
}
- IDCard ์์ฑ์๊ฐ public์ผ๋ก ๋์ด์์ง ์์ → new๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์์ผ๋ฉฐ, ์์ฑ์ ์ํ ๊ฒฝ์ฐ IDCardFactory๋ฅผ ์ด์ฉํด์ผ ํ๋ค!\
public abstract class Product {
public abstract Product(String name) // (X)
public abstract setName(String name) // (O)
}
- Java์์๋ abstractํ ์์ฑ์๋ฅผ ๋ง๋ค ์ ์์
- ์์ฑ์๊ฐ ์์๋์ง ์์ผ๋ฏ๋ก, abstractํ ์์ฑ์๋ ์๋ฏธ๊ฐ ์์
- ์์ฑ์์์ ์ ํ์ ์ด๋ฆ์ ๋ถ์ด๋ ๊ฒ์ด ์๋๋ผ, ์ด๋ฆ์ ๋ถ์ด๋ ๋ฉ์๋๋ฅผ ๋ณ๋๋ก ์ ์ธํด์ผํจ!
๋ฐ์ํ
'๐ Study > ๋์์ธ ํจํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java ์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธํจํด ์ ๋ฌธ] 6. Prototype (0) | 2024.07.07 |
---|---|
[Java ์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธํจํด ์ ๋ฌธ] 5. Singleton (0) | 2024.04.01 |
[Java ์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธํจํด ์ ๋ฌธ] 3. Template Method (0) | 2024.03.18 |
[Java ์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธํจํด ์ ๋ฌธ] 2. Adapter (0) | 2024.03.07 |
[Java ์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธํจํด ์ ๋ฌธ] 1. Iterator (0) | 2024.03.07 |