βοΈ Java Design-Pattern 05 - Factory Method
βοΈ Java Design-Pattern 05 - Factory Method
π
γJAVA μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ : μ½κ² λ°°μ°λ GoFμ 23κ°μ§ λμμΈ ν¨ν΄γλ₯Ό μ½κ³ μ 리ν κΈμ λλ€.
Factory Method ν¨ν΄μ΄λ?
- μΈμ€ν΄μ€ μμ± λ°©λ²μ μμ ν΄λμ€μμ κ²°μ νλ, μ€μ μΈμ€ν΄μ€λ νμ ν΄λμ€μμ μμ±νλ€.
- μ¦ μΈμ€ν΄μ€λ₯Ό μμ±νλ 곡μ₯μΒ
Template MethodΒ ν¨ν΄μΌλ‘ ꡬμ±ν κ²μ΄λ€.
μμ νλ‘κ·Έλ¨
frameworkΒ ν¨ν€μ§μ ν¬ν¨λΒProduct,ΒFactoryΒ ν΄λμ€λ μΈμ€ν΄μ€λ₯Ό μμ±νλ λΌλ μν μ νλ€.idcardΒ ν¨ν€μ§μ ν¬ν¨λΒIDCard,ΒIDCardFactoryΒ ν΄λμ€λ ꡬ체μ μΈ λ΄μ©μ ꡬννλ μν μ νλ€.MainΒ ν΄λμ€λ λμ ν μ€νΈλ₯Ό μν ν΄λμ€μ΄λ€.
ProductΒ ν΄λμ€
1
2
3
4
5
package framework;
public abstract class Product {
public abstract void use();
}
- μ΄ νλ μμν¬μμλ 무μμ΄λ Β
useν μ μλ κ²μ μ νμΌλ‘ κ·μ νλ€.
FactoryΒ ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
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(String product);
}
Template MethodΒ ν¨ν΄μ μ¬μ©νμ¬ΒcreateΒ λ©μλλ₯Ό ν΅ν΄ΒProductΒ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.ΒcreateΒ λ©μλ λ΄ΒcreateProduct,ΒregisterProductΒ λ©μλλ μΆμ λ©μλλ‘ μ μΈλμ΄ μλ€.- μ΄μ²λΌΒ
Factory MethodΒ ν¨ν΄μ μΈμ€ν΄μ€λ₯Ό μμ±ν λΒTemplate MethodΒ ν¨ν΄μ μ¬μ©νλ€.
IDCardΒ ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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() {
return "[IDCard:" + owner + "]"
}
public String getOwner() {
return owner;
}
}
ProductΒ ν΄λμ€μ νμ ν΄λμ€λ‘μ μ μλ ν΄λμ€μ΄λ€.
IDCardFactoryΒ ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package idcard;
import framework.Factory;
import framework.Product;
import java.util.ArrayList;
import java.util.List;
public class IDCardFactory extends Factory {
private List<String> owners = new ArrayList<>();
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(Product product) {
if (product instanceof IDCard) {
IDCard card = (IDCard) product;
owners.add(card.getOwner());
}
}
public List<String> getOwners() {
return owners;
}
}
MainΒ ν΄λμ€
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import framework.Factory;
import framework.Product;
import idcard.IDCardFactory;
public class Main {
public static void main(String args[]) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("κΉμ무κ°");
Product card2 = factory.create("λ°μ무κ°");
Product card3 = factory.create("μ΅μ무κ°");
card1.use();
card2.use();
card3.use();
}
}
- μ€μ λ‘Β
IDCardFactoryΒ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ μ¬μ©νλ λμ ν μ€νΈλ₯Ό μν ν΄λμ€μ΄λ€.
Factory MethodΒ ν¨ν΄μ λ±μ₯μΈλ¬Ό
ProductΒ ν΄λμ€
- νλ μμν¬μ ν΄λΉλλ©°, μ νμν λ‘, μ΄ ν¨ν΄μΌλ‘ μμ±λλ μΈμ€ν΄μ€κ° κ°μ ΈμΌ ν μΈν°νμ΄μ€Β
APIλ₯Ό κ²°μ νλ μΆμ ν΄λμ€μ΄λ€.
FactoryΒ ν΄λμ€
- νλ μμν¬μ ν΄λΉλλ©°, μ ν μν μ μμ±νλ μμ±μΒ
CreatorΒ μν μ νλ€. - μ€μ λ‘ μμ±ν Β
ConcreteProductΒ μν μλ μλ λ°κ° μλ€. - μμ νλ‘κ·Έλ¨μμλΒ
newΒ λμ ΒcreateProductΒ λ©μλλ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό μμ±νλλ°, μ΄λ₯Ό ν΅ν΄ ꡬ체μ μΈ ν΄λμ€ λͺ μ μμ‘΄νμ§ μμ μ μκ² λλ€.
IDCardΒ ν΄λμ€
- ꡬ체μ μΈ μ νΒ
ConcreteProductΒ μν μ λ§‘μ μ ν μν μ ꡬ체μ μΈ κ΅¬νμ μννλ€.
IDCardFactoryΒ ν΄λμ€
- ꡬ체μ μΈ μμ±μΒ
ConcreteCreatorΒ μν μ λ§‘μ μμ±μ μν μ ꡬ체μ μΈ κ΅¬νμ μννλ€.
μ± μμ μ μνλ ννΈ
νλ μμν¬μ ꡬ체μ μΈ λ΄μ©
- μ¬κΈ°μ κ°μ νλ μ μν¬λ₯Ό μ¬μ©νμ¬Β
IDCardκ° μλΒTVλ₯Ό λ§λ λ€κ³ κ°μ ν΄λ³΄μ. - μ΄ κ²½μ°Β
frameworkΒ ν¨ν€μ§λ₯ΌΒimportνλ λ³κ°μΒtelevisionΒ ν¨ν€μ§λ₯Ό λ§λ€κ² λλ€. - κ·Έλ°λ°,Β
frameworkΒ ν¨ν€μ§ λ΄ ν΄λμ€λ€μ μμ ν νμκ° μλ€. - μλνλ©΄Β
frameworkΒ ν¨ν€μ§ λ΄μμλΒidcardΒ ν¨ν€μ§λ₯ΌΒimportΒ ν μ μ΄ μλ€. - μ¦ ν΄λΉ ν¨ν΄μμ νλ μμν¬λ ꡬ체μ μΈ λ΄μ©μ μμ‘΄νμ§ μλλ€λ κ²μ μ μ μλ€.
μΈμ€ν΄μ€ μμ±: λ©μλ ꡬν λ°©λ²
- μΈμ€ν΄μ€ μμ± λ©μλλ₯Ό κΈ°μ νλ λ°©λ²μ λ€μ λ κ°μ§λ‘ μκ°ν μ μλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
/* 1. μΆμ λ©μλλ‘ κΈ°μ */
abstract class Factory {
public abstract Product createProduct(String name);
// ...
}
/* 2. λν΄νΈ ꡬνμ μ€λΉ */
class Factory {
public Product createProduct(String name) {
return new Product(name);
}
}
- μΆμ λ©μλλ‘ κΈ°μ νλ κ²½μ° μμ νλ‘κ·Έλ¨μμ μ¬μ©ν λ°©λ²μΌλ‘, μΆμ λ©μλλ‘ κΈ°μ ν κ²½μ° κ΅¬νλμ΄ μμ§ μλλΌλ μ»΄νμΌν λ κ²μΆλλ€λ μ₯μ μ΄ μλ€.
- λν΄νΈ ꡬνμ μ€λΉνλ κ²½μ° νμ ν΄λμ€μμ ꡬννμ§ μλλΌλ λν΄νΈ ꡬνμ΄ μ¬μ©λλ€λ μ₯μ μ΄ μλ€.
- λ€λ§,Β
ProductΒ ν΄λμ€μ λν΄ μ§μ Βnewλ₯Ό μ€ννμ¬ μΈμ€ν΄μ€λ₯Ό μμ±νλ―λ‘ΒProductΒ ν΄λμ€λ₯Ό μΆμ ν΄λμ€λ‘ λ μ μλ€.
ν¨ν΄ μ΄μ©κ³Ό κ°λ°μ κ°μ μμ¬μν΅
- νλμ ν΄λμ€λ§ μ½μ΄μλ λμμ μ μ΄ν΄ν μ μλ€.
- μμ ν΄λμ€μμ λμμ λΌλλ₯Ό μ΄ν΄ν ν κ±°κΈ°μμ μ¬μ©λλ μΆμ λ©μλκ° λ¬΄μμΈμ§ νμΈνκ³ , λ€μ κ·Έ μΆμ λ©μλλ₯Ό μ€μ λ‘ κ΅¬ννλ ν΄λμ€μ μμ€ μ½λλ₯Ό μ΄ν΄λ³΄μμΌ νλ€.
- μΌλ°μ μΌλ‘ λμμΈ ν¨ν΄μ μ¬μ©ν΄ μ΄λ€ ν΄λμ€ κ΅°μ μ€κ³ν κ²½μ°, μ€κ³μκ° λ³΄μμμκ² μλν λμμΈ ν¨ν΄μ΄ 무μμΈμ§ μ μ λ¬ν νμκ° μλ€.
- κ·Έλ μ§ μμΌλ©΄ μ€κ³μμ μλμμ λ²μ΄λ μμ μ΄ κ°ν΄μ§ μ μλ€.
- μ£Όμμ΄λ κ°λ° λ¬Έμμ μ€μ λ‘ μ¬μ©λλ λμμΈ ν¨ν΄μ λͺ μΉκ³Ό μλλ₯Ό κΈ°μ νμ¬ λλ κ²λ μ’μ λ°©λ²μ΄λ€.
static Factory Method
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* 1. java.security.SecureRandom */
SecureRandom random = SecureRandom.getInstance("NativePRNG");
/* 2. java.util.List */
List<String> list = List.of("Alice", "Bob");
/* 3. java.util.Arrays */
String[] arr = {"Alice", "Bob"};
List<String> list = Arrays.asList(arr);
/* 4. java.lang.String */
String string = String.valueOf('A');
/* 5. java.time.Instant */
Instant instant = Instant.now();
- μΈμ€ν΄μ€ μμ±μ μνΒ
staticΒ λ©μλ μ λ°μΒFactory MethodλΌκ³ λΆλ₯΄λ κ²½μ°κ° μ‘΄μ¬νλ€. - μ΄κ²μΒ
GoFμΒFactory MethodΒ ν¨ν΄κ³Όλ λ€λ₯΄μ§λ§ΒJavaμμ μΈμ€ν΄μ€λ₯Ό μμ±ν λ μμ£Ό μ¬μ©λλ κΈ°λ²μ΄λ€. Java APIΒ λνΌλ°μ€μμλ μΈμ€ν΄μ€ μμ±μ μν ν΄λμ€ λ©μλλ₯ΌΒstatic Factory Methodλ‘ νννκΈ°λ νλ―λ‘ΒJava APIΒ λ νΌλ°μ€λ₯Ό μ½μ λλ μ°Έμ‘°νλ ν΄λμ€μΒstatic Factory Methodκ° μ 곡λλμ§ μ£Όλͺ©ν΄μΌ νλ€.create,ΒnewInstance,ΒgetInstanceΒ λ±μ μ΄λ¦μ΄ μμ£Ό μ¬μ©λμ§λ§, κ·Έ λ°μ μ΄λ¦μ΄ μ¬μ©λλ κ²½μ°λ μλ€.
This post is licensed under CC BY 4.0 by the author.

