Builder Design Pattern

Merhaba, bu yazıda önemli olan başka bir creational patternden bahsediyorum.

Nedir?

Builder pattern size karmaşık bir nesnenin adım adım construct edilmesini (ilklenmesini ) sağlar. Karmaşık bir objectin farklı representationları bu şekilde oluşturulabilir.

Ne zaman kullanılır?

Eğer sürekli kod yazıyorsanız bir object constructorunun çok fazla parametre alabileceği durumları görmüş olmalısınız. Aslında bu durum istenmeyen durumdur. Aynı şekilde bir metodun da çok fazla parametre almasının iyi olmadığı gibi constructorun da çok fazla parametre alması iyi değildir.

İşte tam da burada builder pattern ile bu parametreleri düzenleyebilirsiniz. Özellikle kullanılacak olan yeri , iç içe geçmiş , karmaşık , çok fazla parametre alan constructorlardadır. Ayrıca , kodunuzdan bazı objectlerin farklı representationlarını oluşturmak istediğinizde kullanılabilir.

Nasıl implement edilir?

  • Bütün kullanılan base object representationları için ortak construction adımlarını güzelce tanımladığınızdan emin olun.
  • Bu adımları base builder interface de belirtin
  • Her bir base objectin bir concrete builder classını oluşturun.(yaptığım örnekte bir tane concrete builder classı var)
  • Bu concrete classlar içinde override metotları haricinde nesne oluşturmak için kullanılacak olan başka bir metot tanımlamayı unutmayın (örnekte getResult() )

İnternetten araştırdığım kadarıyla bir çok site house yada car örneği yapmış. House örneğinden çok iyi anlaşılıyor ama bende cep telefonu örneği yapmak istedim. Her zaman söylediğim gibi yaptığım örnekte hata olabilir ayrıca farklı çeşit implementationlar olabilir, ben yazının amacına uygun olarak davrandığımdan , yani sadece builder patternini düşünerek yazdığımdan dolayı bu gibi şeyler ortaya çıkmış olabilir.

package builder;

public class CellPhone {

	private int screen;
	private int camera;
	private int ram;
	private int CPU;
	private int memory;
	private int batery;
	
	public CellPhone(int screen, int camera, int ram, int cPU, int memory, int batery) {
		this.screen = screen;
		this.camera = camera;
		this.ram = ram;
		CPU = cPU;
		this.memory = memory;
		this.batery = batery;
	}

	public int getScreen() {
		return screen;
	}

	public void setScreen(int screen) {
		this.screen = screen;
	}

	public int getCamera() {
		return camera;
	}

	public void setCamera(int camera) {
		this.camera = camera;
	}

	public int getRam() {
		return ram;
	}

	public void setRam(int ram) {
		this.ram = ram;
	}

	public int getCPU() {
		return CPU;
	}

	public void setCPU(int cPU) {
		CPU = cPU;
	}

	public int getMemory() {
		return memory;
	}

	public void setMemory(int memory) {
		this.memory = memory;
	}

	public int getBatery() {
		return batery;
	}

	public void setBatery(int batery) {
		this.batery = batery;
	}

	@Override
	public String toString() {
		return "screen: "+screen+"inch"+"\n"+ "camera: "+camera+"pixel"+"\n"+"ram: "+ram+"gb"+"\n"+
				"CPU: "+CPU+"GHZ"+"\n"+"memory: "+memory+"GB"+"\n"+"batery: "+batery+"mA";
	}

}
package builder;

public class CellPhoneBuilder implements IBuilder{

	private int screen;
	private int camera;
	private int ram;
	private int CPU;
	private int memory;
	private int batery;
	
	
	@Override
	public void buildTouchScreen(int inch) {
		screen = inch;
		
	}

	@Override
	public void buildCamera(int pixel) {
		camera = pixel;
		
	}

	@Override
	public void buildRam(int r) {
		ram = r;
	}

	@Override
	public void buildCPU(int c) {
		CPU = c;
	}

	@Override
	public void buildMemory(int m) {
		memory = m;
	}

	@Override
	public void buildBatery(int b) {
		batery = b;
	}
	
	public CellPhone getResult() {
		return new CellPhone(screen,camera,ram,CPU,memory,batery);
	}

}
package builder;

public interface IBuilder {
	
	public void buildTouchScreen(int inch);
	public void buildCamera(int pixel);
	public void buildRam(int r);
	public void buildCPU(int c);
	public void buildMemory(int m);
	public void buildBatery(int b);
	

}
package builder;

public class Director {
	
	protected IBuilder builder;
	
	public Director(IBuilder builder) {
		this.builder = builder;
	}
	
	public void constructCellPhone() {
		builder.buildTouchScreen(6);
		builder.buildCamera(10);
		builder.buildRam(2);
		builder.buildCPU(3);	
		builder.buildMemory(64);
		builder.buildBatery(3240);
		
	}
}
package builder;

public class Test {

	public static void main(String[] args) {
		
		CellPhoneBuilder builder  = new CellPhoneBuilder();

		Director director = new Director(builder);
		
		director.constructCellPhone();
		
		CellPhone cellPhone = builder.getResult();
		
		System.out.println(cellPhone.toString());
		
	}

}

Örnekte kullandığım telefon özellikleri sadece birkaçı, bunun dışında birçok özellik ekleyebilirsiniz. Bunu bir constructorun parametresine geçirdiğinizi düşünün 🙂

Kaynaklar

https://refactoring.guru/design-patterns/builder

https://sourcemaking.com/design_patterns/builder/java/2

https://www.geeksforgeeks.org/builder-design-pattern/