[디자인 패턴] ProtoType 패턴

이멀젼씨

·

2020. 2. 11. 13:31

- 정의

 

인스턴스를 생성할 때, 기존에 생성된 인스턴스를 복사하여 새로운 인스턴스를 생성하는 패턴이다

 

- UML

1. Programming클래스를 선언하고 os, network, db를 멤버 변수로 갖는다. 각각의 변수마다 getter와 setter를 설정해주고 copy함수를 통해 인스턴스를 복사할 수 있도록 한다

 

- 코드

 

Programming class

public class Programming implements Cloneable{
	private String os;
	private String network;
	private String db;
	public String getOs() {
		return os;
	}
	public void setOs(String os) {
		this.os = os;
	}
	public String getNetwork() {
		return network;
	}
	public void setNetwork(String network) {
		this.network = network;
	}
	public String getDb() {
		return db;
	}
	public void setDb(String db) {
		this.db = db;
	}
	
	public Programming copy() throws CloneNotSupportedException {
		Programming programming = (Programming) clone();
		return programming;
	}
}

Main class

public class Main {

	public static void main(String[] args) throws CloneNotSupportedException {
		Programming programming1 = new Programming();
		programming1.setOs("Window10");
		programming1.setNetwork("LAN");
		programming1.setDb("Mysql");
		
		System.out.println("-----programming1-----");
		System.out.println(programming1.getOs());
		System.out.println(programming1.getNetwork());
		System.out.println(programming1.getDb());
		
		Programming programming2 = programming1.copy();
		System.out.println("-----Programming programming2 = programming1.copy()-----");
		System.out.println("-----Change programming2-----");
		programming2.setOs("Window8.1");
		programming2.setNetwork("WAN");
		programming2.setDb("Mssql");
		
		System.out.println("-----programming1-----");
		System.out.println(programming1.getOs());
		System.out.println(programming1.getNetwork());
		System.out.println(programming1.getDb());
		
		System.out.println("-----programming2-----");
		System.out.println(programming2.getOs());
		System.out.println(programming2.getNetwork());
		System.out.println(programming2.getDb());
		

		System.out.println("-----Programming programming3 = programming1-----");
		Programming programming3 = programming1;
		System.out.println("-----Change programming3-----");
		programming3.setOs("Linux");
		programming3.setNetwork("MAN");
		programming3.setDb("MongoDb");
		
		System.out.println("-----programming1-----");
		System.out.println(programming1.getOs());
		System.out.println(programming1.getNetwork());
		System.out.println(programming1.getDb());
		
		System.out.println("-----programming3-----");
		System.out.println(programming3.getOs());
		System.out.println(programming3.getNetwork());
		System.out.println(programming3.getDb());

	}

}

 

- 설명

여러 인스턴스를 생성할때 new를 통해 생성하는 것보다 비용을 효과적으로 줄일 수 있다

 

이 패턴에서 알아두어야 할 것은 Programming클래스에 copy라는 함수를 통해 복사되는 건 깊은 복사가 되어 독립적인 인스턴스가 생성된 것이고

 

programming3에 대입연산자를 통해 programming1을 대입한 것은 얕은 복사가 일어나 참조값의 복사가 일어난 것이다

 

따라서 programming2의 멤버를 변경해도 programming1에는 영향을 주지 않지만, programming3의 멤버를 변경하게 되면 같은 참조값을 갖고 있는 programming1의 멤버도 변경된다는 점을 알아두어야 한다

여러 인스턴스 생성