Prototype Design Pattern

Merhaba, bu yazıda bir başka creational design pattern olan prototype design patterndan bahsediyorum. Bir önceki yazıda adapter patterndan bahsetmiştim dilerseniz göz atabilirsiniz.

Prototype pattern nesne üretmek maliyetli olduğunda copy constructor yerine kullanılabilir. Bu patternin amacı bir nesneyi olabildiğince az maliyetle kopyalamaktır. Eğer java programlama diline aşina iseniz , java da clone () metodunu görmüşsünüzdür. Clone() metodu işte tam da bu görevi üstlenmektedir.

Kısacası bu pattern , var olan bir objecti diğer classlara bağlı kalmadan kopyalamayı sağlar.

ilk örnekte java da cloneable interface ‘i kullanarak deneyelim.

package prototypeJAVA;

public abstract class Worker implements Cloneable{
	
	protected String name;
	protected String lastName;
	protected int  salary;
	
	public Worker clone() {
		Worker clone = null;
			
		try {
			clone = (Worker)super.clone();
		}
		catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return clone;
	}
}
package prototypeJAVA;

public class Developer extends Worker {
	
	protected int extraSalary;

}
package prototypeJAVA;

public class Test {

	public static void main(String[] args) {
		Developer d1 = new Developer();
		d1.extraSalary=100;
		d1.lastName="lastName";
		d1.name = "Name";
		d1.salary=1500;
		
		Developer d2 = (Developer)d1.clone();
		System.out.println(d2.lastName +" "+ d2.name);
		
		d1.lastName="changed";
		System.out.println(d1.lastName);
		System.out.println(d2.lastName);
	}

}

Burada dikkatinizi çekmek istediğim nokta copy object oluştuğunda önceki ile aynı referansı tutmamasıdır. Yani bu iki object tamamen farklıdır. Örnekte de göstermeye çalıştığım gibi d1 objectinin lastName i değiştiği halde d2 nin lastName i değişmiyor çünkü bunlar farklı objectler.

Diğer örnek ise aşağıdadır.

package prototype;

public abstract class Worker {
	
	protected String name;
	protected String lastName;
	protected int  salary;
	
	public abstract Worker clone();
}

package prototype;

public class Developer  extends Worker{
	
	protected int extraSalary;
	
	public Developer() {
		
	}
	
	public Developer(Developer d) {
		if(d != null) {
			this.extraSalary=d.extraSalary;
			this.lastName=d.lastName;
			this.name=d.name;
			this.salary=d.salary;			
		}
			
	}

	@Override
	public Worker clone() {
		return new Developer(this);
	}

}
package prototype;

public class Test {
	
	public static void main(String[] args) {
		
		Developer d1 = new Developer();
		d1.extraSalary=100;
		d1.lastName="lastName";
		d1.name = "Name";
		d1.salary=1500;
		
		Developer d2 = (Developer) d1.clone();
		System.out.println(d2.lastName);
	}

}

Bu yazıda anlatacaklarım bu kadar. Design pattern konusunu bu blogta bitirmeme yaklaşık 5 tane pattern kaldı. Son 5 pattern için takipte kalın 🙂