Java/Design Pattern

프로토타입 패턴 Prototype

keartt 2023. 1. 16. 23:11
반응형

객체를 생성하는데 비용? 시간이 많이 들고, 비슷한 객체가 이미 있는 경우 사용되는 패턴

  • 원본 객체를 새로운 객체에 복사하여 필요에 따라 수정함
    • clone 메소드를 사용함 
    • 생성 패턴

  • clone  메소드를 사용 -> 생성하고자 하는 객체에 clone 에 대한 Override 필요
    • 반드시 생성하고자 하는 객체의 클래스에 clone 메소드가 정의되어 있어야 함

[디자인패턴] 프로토타입패턴(Prototype Pattern) (velog.io)

 

 

package designPattern.prototype;

import java.util.ArrayList;
import java.util.List;

public class Employees implements Cloneable {
	private List<String> empList;

	public Employees() {
		empList = new ArrayList<String>();
	}

	public Employees(List<String> list) {
		this.empList = list;
	}

	public void loadData() {
		empList.add("Ann");
		empList.add("David");
		empList.add("John");
		empList.add("Methew");
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		List<String> temp = new ArrayList<>();
		for (String str : this.empList) {
			temp.add(str);
		}
		return new Employees(temp);
	}

	public List<String> getEmpList() {
		return empList;
	}
}

 

import java.util.List;

public class PrototypePattern {
    public static void main(String[] args) throws CloneNotSupportedException {
        Employees emps = new Employees();
        emps.loadData(); // Ann, John, Methew...

        Employees emps1 = (Employees) emps.clone();
        Employees emps2 = (Employees) emps.clone();

        List < String > list1 = emps1.getEmpList();
        list1.add("Peter");

        List < String > list2 = emps2.getEmpList();
        list2.remove("John");

        System.out.println("emps: " + emps.getEmpList());
        System.out.println("emps1: " + list1);
        System.out.println("emps2: " + list2);
    }
}

console : 

더보기

emps: [Ann, David, John, Methew]
emps1: [Ann, David, John, Methew, Peter]
emps2: [Ann, David, Methew]

반응형