Prototype ํจํด
๐ก ํด๋์ค์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋์ ์ธ์คํด์ค๋ก๋ถํฐ ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ์์ฑ
- ์ข
๋ฅ๊ฐ ๋๋ฌด ๋ง์ ํด๋์ค๋ก ์ ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ
- ์ทจ๊ธํ ์ค๋ธ์ ํธ์ ์ข ๋ฅ๊ฐ ๋ง์์ ์์ค ํ์ผ์ ๋ง์ด ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ
- ํด๋์ค๋ก๋ถํฐ ์ธ์คํด์ค ์์ฑ์ด ์ด๋ ค์ด ๊ฒฝ์ฐ
- ๋ณต์กํ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ง๋ค์ด์ง๋ ๊ฒ์ผ๋ก ํด๋์ค๋ก๋ถํฐ ๋ง๋ค๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์ด ๊ฒฝ์ฐ
- ์ฌ์ฉ์ ์กฐ์์ผ๋ก ๋ง๋ค์ด์ง ์ธ์คํด์ค์ ๊ฐ์ ๊ฒ์ ๋ค์ ๋ง๋ค๊ณ ์ถ์ ๊ฒฝ์ฐ
- โ ํ์ฌ ๋ง๋ ์ธ์คํด์ค๋ฅผ ์ผ๋จ ์ ์ฅํด๋๊ณ ๋ง๋ค๊ณ ์ถ์ ๋ ์ด๋ฅผ ๋ณต์ฌํ์ฌ ์์ฑ
- ํ๋ ์์ํฌ์ ์์ฑํ๋ ์ธ์คํด์ค๋ฅผ ๋ถ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ
- ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ํ๋ ์์ํฌ๋ฅผ ํน์ ํด๋์ค์ ์์กดํ์ง ์๊ฒ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ
- โ ๋ฏธ๋ฆฌ ์ํ์ด ๋ ์ธ์คํด์ค๋ฅผ ๋ฑ๋กํด๋๊ณ , ๋ฑ๋ก๋ ์ธ์คํด์ค๋ฅผ ๋ณต์ฌํ์ฌ ์์ฑ
Prototype(์ํ)
์ธ์คํด์ค๋ฅผ ๋ณต์ฌํ์ฌ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ๊ฒฐ์
package framework;
public interface Product extends Cloneable {
public abstract void use(String s);
public abstract Product createCopy();
}
- `use` : ‘์ฌ์ฉ’ํ๊ธฐ ์ํ ๊ฒ → ํ์ ํด๋์ค์ ๊ตฌํ์ ๋งก๊น
- `createCopy` : ์ธ์คํด์ค๋ฅผ ๋ณต์ ํ๊ธฐ ์ํ ๋ฉ์๋
ConcretePrototype(๊ตฌ์ฒด์ ์ธ ์ํ)
์ธ์คํด์ค๋ฅผ ๋ณต์ฌํ์ฌ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋ฉ์๋ ๊ตฌํ
import framework.Product;
public class MessageBox implements Product {
private char decochar;
public MessageBox(char decochar) {
this.decochar = decochar;
}
@Override
public void use(String s) {
int decolen = 1 + s.length() + 1;
for(int i = 0 ; i < decolen; i ++) {
System.out.println(decochar);
}
System.out.println();
System.out.println(decochar + s + decochar);
for(int i = 0; i < decolen; i++) {
System.out.print(decochar);
}
System.out.println();
}
@Override
public Product createCopy() {
Product p = null;
try {
p = (Product) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
- `createCopy` : ์๊ธฐ ์์ ์ ๋ณต์ ํ๋ ๋ฉ์๋
- `clone()` : Java ์ธ์ด ์ฌ์์ผ๋ก ๊ท์
- ์๊ธฐ ์์ ์ ๋ณต์ ๋ฅผ ์์ฑํ๋ ๋ฉ์๋
- ์ธ์คํด์ค๊ฐ ๊ฐ์ง ํ๋ ๊ฐ๋ ๊ทธ๋๋ก ์ ์ธ์คํด์ค์ ๋ณต์ฌ
- `clone()` : Java ์ธ์ด ์ฌ์์ผ๋ก ๊ท์
- Java์ clone() ์ ์์ ์ ํด๋์ค์์๋ง ํธ์ถ ๊ฐ๋ฅ → ๋ค๋ฅธ ํด๋์ค์ ์์ฒญ์ผ๋ก ๋ณต์ ํ ๊ฒฝ์ฐ, createCopy ์ ๊ฐ์ ๋ณ๋์ ๋ฉ์๋๋ก ๊ฐ์ธ์ฃผ์ด์ผ ํจ
Client(์ด์ฉ์)
์ธ์คํด์ค๋ฅผ ๋ณต์ฌํ๋ ๋ฉ์๋๋ฅผ ์ด์ฉํด ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑ
package framework;
import java.util.*;
public class Manager {
private Map<String Product> showcase = new HashMap<>();
public void register(String name, Product prototype) {
showcase.put(name, prototype);
}
public Product create(String prototypeName) {
Product p = showcase.get(prototypeName);
return p.createCopy();
}
}
- ๊ตฌ์ฒด์ ์ธ ๊ฐ๋ณ ํด๋์ค ์ด๋ฆ์ ์ฐ์ง ์๊ณ , ์ค์ง ์ธํฐํ์ด์ค๋ง์ ์ฌ์ฉ
๐ Kotlin copy() method VS Prototype Pattern
์ฝํ๋ฆฐ์์๋ ๋ฐ์ดํฐ ํด๋์ค์ copy() ๋ฉ์๋๋ฅผ ์ง์ํ๋ค. ํด๋น ๋ฉ์๋๋ก ๋์ผํ ๋ด์ฉ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฝํ๋ฆฐ์์๋ copy() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ์๋ฐ prototype ํจํด์ด ํ์ํ ๊น ๊ถ๊ธํด์ก๋ค.
๋ฐ์ดํฐ ํด๋์ค์ `copy()`๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ ์ ์๊ฒ ํด์ฃผ์ง๋ง, Prototype pattern์ ๊ตฌํ์ด๋ผ๊ณ ์ ํํ ๋งํ ์๋ ์๋ค. ๋ณต์ ๋ณธ์ ๋ง๋ ๋ค๋ ์ ์์๋ ํ๋กํ ํ์ ํจํด๊ณผ ์ ์ฌํ ์ ์์ง๋ง, ์ถ์ํ๊ฐ ๋ถ์กฑํ๋ค.
๋ฐ์ดํฐ ํด๋์ค์ copy() ๊ธฐ๋ฅ์ ๋จ์ํ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๊ฐ๋จํ๊ฒ ๋ณต์ ํ๋ ๋งค์ปค๋์ฆ์ด๋ค. ๋ค์ํ ์ข ๋ฅ์ ๋ฐ์ดํฐ ํ์ ์ ๊ฐ์ง ๊ฑฐ๋ํ ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ๋๋ฐ์๋ ์ ์ฐํ์ง ์๋ค. ๋ฌผ๋ก , ํ๋กํ ํ์ ํจํด์ `copy()`๋ฅผ ํ์ฉํ์ฌ ๊ตฌํ์ ๊ฐ์ํํ ์ ์๋ค.
https://medium.com/@hm.dieppa/kotlin-prototype-b9bb4120e826
→ copy()๋ ํ๋์ ๊ธฐ๋ฅ์ผ ๋ฟ์ด๊ณ , prototype์ ๋ง๊ทธ๋๋ก ๋์์ธ ํจํด์ด๋ค!