Search

ํ”„๋กœํ† ํƒ€์ž… ํŒจํ„ด

ํ”„๋กœํ† ํƒ€์ž… ํŒจํ„ด (Prototype Pattern)

ํ”„๋กœํ† ํƒ€์ž… ํŒจํ„ด์€ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๊ณผ์ •์„ ์ถ”์ƒํ™”ํ•˜๊ณ , ๊ฐ์ฒด ์ƒ์„ฑ ๋น„์šฉ์„ ์ค„์ด๋ฉฐ, ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๋™์ ์œผ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

์ฃผ์š” ๋ชฉ์ 

โ€ข
๋ณต์žกํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„์†Œํ™”
โ€ข
๊ฐ์ฒด ์ƒ์„ฑ์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ์ ˆ์•ฝ
โ€ข
๋Ÿฐํƒ€์ž„์— ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑ

ํŠน์ง•

โ€ข
๊ธฐ์กด ๊ฐ์ฒด์˜ clone() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
โ€ข
๊ฐ์ฒด ์ƒ์„ฑ ๋น„์šฉ์ด ๋†’์€ ๊ฒฝ์šฐ ํšจ๊ณผ์ 
โ€ข
๊นŠ์€ ๋ณต์‚ฌ์™€ ์–•์€ ๋ณต์‚ฌ ๊ตฌํ˜„ ๋ฐฉ์‹ ์„ ํƒ ๊ฐ€๋Šฅ

์˜ˆ์‹œ ์ฝ”๋“œ

public abstract class Shape implements Cloneable { private String id; protected String type; abstract void draw(); public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } } public class Circle extends Shape { public Circle() { type = "Circle"; } @Override void draw() { System.out.println("Circle ๊ทธ๋ฆฌ๊ธฐ"); } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ ์„ค๋ช…

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ํ”„๋กœํ† ํƒ€์ž… ํŒจํ„ด์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:
โ€ข
Shape ํด๋ž˜์Šค: ์ถ”์ƒ ํด๋ž˜์Šค๋กœ, Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ณต์ œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
โ€ข
clone() ๋ฉ”์„œ๋“œ: Object ํด๋ž˜์Šค์˜ clone() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ๊ฐ์ฒด์˜ ๋ณต์ œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Circle ํด๋ž˜์Šค: Shape๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌ์ฒด์ ์ธ ๋„ํ˜•์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
์ด ๊ตฌํ˜„์„ ํ†ตํ•ด Circle ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ , ๊ธฐ์กด Circle ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ๋น„์šฉ์ด ๋†’์€ ๊ฒฝ์šฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
// ์‚ฌ์šฉ ์˜ˆ์‹œ Circle circle = new Circle(); Circle clonedCircle = (Circle) circle.clone();
Java
๋ณต์‚ฌ
๋ณต์ œ๋œ ๊ฐ์ฒด๋Š” ์›๋ณธ ๊ฐ์ฒด์™€ ๋™์ผํ•œ ์†์„ฑ์„ ๊ฐ€์ง€์ง€๋งŒ, ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.