Bu noktada, muhtemelen zaten tasarım kalıplarıyla karşılaşmışsınızdır. Örneğin, singleton .

Kalıpların ne olduğunu, neden gerekli olduklarını ve yaratım kalıplarının neler olduğunu hatırlayalım (singleton bir örnektir). Ayrıca yeni bir modeli de inceleyeceğiz: fabrika yöntemi.

Yazılım geliştirmede, bir tasarım deseni, yinelenen bir bağlamda bir tasarım sorununa bir çözümü temsil eden, tekrarlanabilir bir mimari yapıdır.

Tipik olarak bir model, doğrudan koda dönüştürülebilen nihai bir çözüm değildir. Çeşitli durumlarda kullanılabilecek bir problemin sadece model çözümüdür.

Yaratılış kalıpları, nesne yaratma süreciyle ilgilenen tasarım kalıplarıdır. Nesneleri oluşturmak, birleştirmek ve sunmak için kullanılan yöntemden bağımsız bir sistem oluşturmayı mümkün kılarlar.

Bir fabrika yöntemi, bir ana sınıfta nesneler oluşturmak için ortak bir arabirim tanımlayan ve onun soyundan gelenlere bu nesneleri oluşturma yeteneği veren yaratıcı bir tasarım modelidir. Oluşturma sırasında, torunlar hangi sınıfın oluşturulacağını belirleyebilir.

Desen hangi sorunu çözüyor?

Bir teslimat programı oluşturmaya karar verdiğinizi hayal edin. Başlangıçta arabalı kuryeler kiralayacak veArabaprogramda bir teslimat aracını temsil eden nesne. Kuryeler paketleri A noktasından B noktasına vb. Basit.

Program popülerlik kazanıyor. İşletmeniz büyüyor ve yeni pazarlara açılmak istiyorsunuz. Örneğin, yiyecek ve nakliye taşımacılığı da yapmaya başlayabilirsiniz. Bu durumda yiyecekler kuryelerle yaya, scooter ve bisikletle teslim edilebilir, ancak nakliye için kamyonlara ihtiyaç vardır.

Şimdi, her kuryenin ne kadar taşıyabileceği de dahil olmak üzere birkaç şeyi (ne zaman, kime, neyin ve ne kadar teslim edileceği) takip etmeniz gerekiyor. Yeni ulaşım modları farklı hızlara ve kapasitelere sahip. Ardından, programınızdaki çoğu varlığın programa güçlü bir şekilde bağlı olduğunu fark edersiniz.Arabasınıf. Programınızın diğer teslimat yöntemleriyle çalışmasını sağlamak için mevcut kod tabanını yeniden yazmanız ve bunu her yeni araç eklediğinizde yeniden yapmanız gerekeceğini anlıyorsunuz.

Sonuç, taşıma türüne bağlı olarak farklı eylemler gerçekleştiren koşullu ifadelerle dolu korkunç bir koddur.

Çözüm

Fabrika yöntemi modeli, doğrudan new işlecini kullanmak yerine özel bir fabrika yöntemi çağırarak nesneler oluşturmayı önerir . Fabrika yöntemine sahip sınıfın alt sınıfları, belirli araçların oluşturulan nesnelerini değiştirebilir. İlk bakışta bu anlamsız görünebilir: Yapıcı çağrısını programda bir yerden başka bir yere taşıdık. Ancak artık, oluşturulan taşıma türünü değiştirmek için bir alt sınıftaki fabrika yöntemini geçersiz kılabilirsiniz.

Bu yaklaşım için sınıf diyagramına bakalım:

Bu sistemin çalışması için, döndürülen tüm nesnelerin ortak bir arabirime sahip olması gerekir. Alt sınıflar, bu arayüzü uygulayan farklı sınıflardan nesneler üretebilecektir.

Örneğin, Kamyon ve Araba sınıfları, bir teslim yöntemiyle CourierTransport arabirimini uygular . Bu sınıfların her biri, yöntemi farklı bir şekilde uygular: kamyonlar yük taşırken, arabalar yiyecek, paket vb. teslim eder. TruckCreator sınıfındaki fabrika yöntemi bir kamyon nesnesi döndürür ve CarCreator sınıfı bir araba nesnesi döndürür.

Fabrika yönteminin müşterisi için, bu nesneler arasında bir fark yoktur, çünkü onları bir tür soyut CourierTransport olarak ele alacaktır . İstemci, nesnenin teslim etmek için bir yöntemi olmasına derinden önem verecektir, ancak bu yöntemin tam olarak nasıl çalıştığı önemli değildir.

Java'da uygulama:


public interface CourierTransport {
	void deliver();
}
public class Car implements CourierTransport {
	@Override
	public void deliver() {
    		System.out.println("The package is being delivered by car");
	}
}
public class Truck implements CourierTransport {
	@Override
	public void deliver() {
    		System.out.println("The freight is being delivered by truck");
	}
}
public abstract class CourierTransportCreator {
	public abstract CourierTransport createTransport();
}
public class CarCreator extends CourierTransportCreator {
	@Override
	public CourierTransport createTransport() {
    		return new Car();
	}
}
public class TruckCreator extends CourierTransportCreator {
	@Override
	public CourierTransport createTransport() {
    		return new Truck();
	}
}
 
public class Delivery {
	private String address;
	private CourierTransport courierTransport;
 
	public void Delivery() {
	}
 
	public Delivery(String address, CourierTransport courierTransport) {
    	this.address = address;
    	this.courierTransport = courierTransport;
	}
 
	public CourierTransport getCourierTransport() {
    		return courierTransport;
	}
 
	public void setCourierTransport(CourierTransport courierTransport) {
    		this.courierTransport = courierTransport;
	}
 
	public String getAddress() {
    		return address;
	}
 
	public void setAddress(String address) {
    		this.address = address;
	}
}
public static void main(String[] args) {
    	// Accept a new type of order from the database (pseudocode)
    	String type = database.getTypeOfDeliver();
 
    	Delivery delivery = new Delivery();
    	
    	// Set the transport for delivery
        delivery.setCourierTransport(getCourierTransportByType(type));
    	
    	// Make the delivery
        delivery.getCourierTransport().deliver();
 
	}
 
	public static CourierTransport getCourierTransportByType(String type) {
    	switch (type) {
        	case "CarDelivery":
            	return new CarCreator().createTransport();
        	case "TruckDelivery":
            	return new TruckCreator().createTransport();
        	default:
            	throw new RuntimeException();
	    }
	}
    

Yeni bir teslimat nesnesi oluşturmak istiyorsak, program otomatik olarak uygun bir taşıma nesnesi oluşturur.

Bu kalıbı ne zaman uygulamalıyız?

1. Kodunuzun birlikte çalışması gereken nesnelerin türlerini ve bağımlılıklarını önceden bilmiyorsanız.

Fabrika yöntemi, taşıma biçimlerini üretme kodunu taşımayı kullanan koddan ayırır. Sonuç olarak, nesne oluşturma kodu, kodun geri kalanına dokunmadan genişletilebilir.

Örneğin, yeni bir taşıma türüne destek eklemek için yeni bir alt sınıf oluşturmanız ve içinde yeni taşımanın bir örneğini döndüren bir fabrika yöntemi tanımlamanız gerekir.

2. Yeni nesneler oluşturmak yerine mevcut nesneleri yeniden kullanarak sistem kaynaklarından tasarruf etmek istediğinizde.

Bu sorun genellikle veritabanı bağlantıları, dosya sistemleri vb. gibi kaynak yoğun nesnelerle çalışırken ortaya çıkar.

Mevcut nesneleri yeniden kullanmak için atmanız gereken adımları düşünün:

  1. Öncelikle, oluşturduğunuz tüm nesneleri depolamak için paylaşılan bir havuz oluşturmanız gerekir.

  2. Yeni bir nesne talep ederken, depoya bakmanız ve mevcut bir nesne içerip içermediğini kontrol etmeniz gerekir.

  3. Nesneyi müşteri koduna döndürün.

  4. Ancak kullanılabilir nesne yoksa, yeni bir tane oluşturun ve depoya ekleyin.

Tüm bu kodun, müşteri kodunu karıştırmayacak bir yere konması gerekir. En uygun yer yapıcı olacaktır, çünkü tüm bu kontrollere yalnızca nesneleri oluştururken ihtiyacımız var. Ne yazık ki, bir kurucu her zaman yeni bir nesne yaratır - mevcut bir nesneyi döndüremez.

Bu, hem mevcut hem de yeni nesneleri döndürebilen başka bir yönteme ihtiyaç olduğu anlamına gelir. Bu fabrika yöntemi olacaktır.

3. Kullanıcıların çerçevenizin veya kitaplığınızın bölümlerini genişletmesine izin vermek istediğinizde.

Kullanıcılar, çerçeve sınıflarınızı kalıtım yoluyla genişletebilir. Ancak, çerçevenin standart olanlar yerine bu yeni sınıfların nesnelerini oluşturmasını nasıl sağlarsınız?

Çözüm, kullanıcıların yalnızca bileşenleri değil, aynı zamanda bu bileşenleri oluşturan sınıfları da genişletmesine izin vermektir. Bunun için de oluşturucu sınıfların tanımlanabilecek belirli oluşturma yöntemlerine sahip olması gerekir.

Avantajlar

  • Bir sınıfı belirli ulaşım sınıflarından ayırır.
  • Taşıma biçimleri oluşturma kodunu tek bir yerde tutar ve kodun bakımını kolaylaştırır.
  • Programa yeni ulaşım modlarının eklenmesini basitleştirir.
  • Açık-kapalı prensibini uygular.

Dezavantajları

Her ürün sınıfının kendi yaratıcı alt sınıfı olması gerektiğinden, büyük paralel sınıf hiyerarşilerine yol açabilir.

Özetleyelim

Fabrika yöntemi modelini öğrendiniz ve olası bir uygulama gördünüz. Bu model genellikle başka nesneler oluşturmak için nesneler sağlayan çeşitli kitaplıklarda kullanılır.

Ana iş mantığınızla etkileşim kurmak ve farklı bağlamlar nedeniyle kodunuzu şişirmemek için mevcut sınıfların alt sınıflarının yeni nesnelerini kolayca eklemek istediğinizde fabrika yöntemi modelini kullanın.