Factory Design Pattern Ve Java İle Örneklemesi

Merhabalar arkadaşlar. Bu yazıda sizlere Factory Design Pattern’ı ve Java ile örneklemesini anlatmaya çalışacağım.

Factory Design Pattern

Dünyadaki OOP yönelimli programlama dillerinde en çok kullanılan Design Pattern olduğu tahmin edilen Factory Design Pattern nesne üretimi konusunda nesneye ihtiyacı olan kodun direkt olarak kendisi new operatörü ile oluşturması yerine bir factory mekanizmasından yeni bir nesne talep etmesi mantığı üzerine kuruludur. Bu factory mekanizması da abstraction kullanarak işlemini halletmeyi hedefler. Aşağıda yapacağımız örnekle bu açıklamayı pekiştirelim.

Shape.java

Shape bizim interface’imiz ve içerisinde implement edilmek üzere bir draw() metodu tutuyor.

package com.ilkaygunel.designpatterns.factory;

public interface Shape {
	public void draw();
}

Circle, Rectangle ve Square Sınıfları

Circle, Rectangle ve Square sınıfları Shape arabirimini uygulayan ve içerisinde draw() metodunu kendilerine göre override eden sınıflardır.

package com.ilkaygunel.designpatterns.factory;

public class Circle implements Shape {

	@Override
	public void draw() {
		System.out.println("Inside Circle::draw() method.");
	}
}
package com.ilkaygunel.designpatterns.factory;

public class Rectangle implements Shape {

	@Override
	public void draw() {
		System.out.println("Inside Rectangle::draw() method.");
	}
}
package com.ilkaygunel.designpatterns.factory;

public class Square implements Shape {

	@Override
	public void draw() {
		System.out.println("Inside Square::draw() method.");
	}
}

ShapeEnum.java

Shape arabirimini implente etmiş sınıflarımızı bir de ShapeEnum enum’ı içerisinde tutuyoruz. Bu enum’ı oluşturmadaki amaç factory mekanizması için çalışacak kodun SOLID prensiplerinden Open/Closed prensibine yani direk iş yapan kodda değişiklik yapımaması fakat kodun da geliştirmeye açık olması prensibine uygun olmasını sağlamaktır.

package com.ilkaygunel.designpatterns.factory;

public enum ShapeEnum {
	RECTANGLE(Rectangle.class.getName(), Rectangle.class),
	SQUARE(Square.class.getName(), Square.class),
	CIRCLE(Circle.class.getName(), Circle.class);

	private final String shapeName;
	private final Class<?> classType;

	private ShapeEnum(String shapeName, Class<?> classType) {
		this.shapeName = shapeName;
		this.classType = classType;
	}

	public String getShapeName() {
		return shapeName;
	}

	public Class<?> getClassType() {
		return classType;
	}
}

ShapeFactory.java

ShapeFactory sınıfımız bizim Factory Design Pattern mekanizmamızı üstlenen kısımdır. Kod içerisinde az önce bahsettiğim gibi Open/Closed prensibine uygun olsun diye getShape(…) metodu ShapeEnum tipinde bir parametre alıyor.getShape metodu aynı zamanda yine Open/Closed prensibine uygun olması amacı ile Reflection’dan da yararlanılarak yazılmıştır. Aksi takdir de if-else’ler ile nesne oluşturup döndürümü gerekecekti.

package com.ilkaygunel.designpatterns.factory;

public class ShapeFactory {
	public Shape getShape(ShapeEnum shape) throws Exception {
		try {
			return (Shape) Class.forName(shape.getShapeName()).getConstructors()[0].newInstance();
		} catch (Exception e) {
			throw e;
		}
	}
}

FactoryPatternDemo.java

FactoryPatternDemo sınıfımız da bizim main metodumuzu koşturduğumuz sınıfımız. Koddan göreceğimiz üzere elde ettiğimiz bir ShapeFactory nesnesi üzerinden getShape metodu çağırımlarında ShapeEnum enum’ındaki alanlardan birisini parametre olarak geçiriyoruz ve akabinde draw() metodunu çağırıyoruz. Nesne elde edimi (circle,rectangle,square nesneleri) direkt olarak new operatörü ile değil ShapeFactory üzerinden yapılıyor ve böylece Factory Design Pattern kullanılmış oluyor.

package com.ilkaygunel.designpatterns.factory;

public class FactoryPatternDemo {
	public static void main(String[] args) {
		ShapeFactory shapeFactory = new ShapeFactory();
		try {

			Shape circle = shapeFactory.getShape(ShapeEnum.CIRCLE);
			circle.draw();

			Shape rectangle = shapeFactory.getShape(ShapeEnum.RECTANGLE);
			rectangle.draw();

			Shape square = shapeFactory.getShape(ShapeEnum.SQUARE);
			square.draw();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Bu yazıda anlatacağım da bu kadar arkadaşlar. Factory Design Pattern’ın ne olduğunu öğrenmiş ve Java ile örneklemiş olduk.

Başka bir yazıda görüşene kadar sağlıcakla kalın.

Görüşmek üzere.

Yazıda kullandığım 2 kaynak: https://www.tutorialspoint.com/design_pattern/factory_pattern.htm https://kodcu.com/2014/08/design-patterns-1-giris-factory-ve-abstract-factory-tasarim-kaliplari-2/

Selam ve Sevgilerimle