Abstract Factory Pattern

design-patterns-abstract-factory-pattern

Abstract Factory Pattern, bir Creational Design Pattern’dir ve nesne oluşturmayı soyutlar. Bu desen, bir ailenin nesnelerini oluşturmak için bir arayüz veya soyut bir sınıf kullanır. Bu, nesnelerin oluşturulma mantığını müşteriden gizler ve bir ailenin tüm nesnelerinin uyumlu olduğundan emin olur. Bu desen, birçok alt sınıf oluşturma işlemlerini merkezi olarak yönetir.

Creational Design Pattern nedir?

Creational Design Pattern yani Yaratıcı tasarım desenleri nesnenin yaratılması üzerinde çalışır. Bir nesneyi mümkün olan en iyi şekilde somutlaştırmak için bir çözüm sunarlar. Oluşturucularla doğrudan örnekleme yerine genellikle Yaratılış kalıplarını kullanırız.

Yaratıcı tasarım kalıpları, yaratım sürecini daha uyarlanabilir ve dinamik hale getirir. Özellikle nesne yaratmanın esnekliği ve nesneleri yaratma ve onları başlatma biçimiyle ilgilenebilirler.

design-patterns-abstract-factory-pattern

Abstract Factory Pattern Unsurları

  1. Abstract Factory: Farklı nesne türleri ailesini oluşturmak için soyut bir arayüz veya sınıfı temsil eder. Bu arayüz, nesnelerin nasıl oluşturulacağını tanımlayan metotları içerir.
  2. Concrete Factories: Abstract Factory’nin farklı uygulamalarını temsil eden somut fabrika sınıflarıdır. Her somut fabrika, belirli bir nesne ailesini oluşturur.
  3. Abstract Products: Bir nesne ailesinin üyelerini temsil eden soyut sınıfları veya arayüzleri içerir. Her ürün, farklı somut fabrikalara göre uyarlanabilir.
  4. Concrete Products: Abstract Products’un somut uygulamalarını temsil eder. Her somut ürün, bir ailenin üyesini tanımlayan belirli özelliklere sahiptir.

Abstract Factory Pattern Kullanım Adımları

  1. Abstract Factory sınıfını tanımlayın ve bu sınıfın nesneleri oluşturmak için soyut metotları içerdiğinden emin olun.
  2. Farklı nesne aileleri için Concrete Factory sınıflarını oluşturun ve Abstract Factory’yi uygulayın. Her Concrete Factory, belirli bir ailenin nesnelerini oluşturur.
  3. Abstract Product sınıflarını veya arayüzlerini tanımlayın ve bu sınıfların her biri için somut ürün sınıflarını oluşturun. Her somut ürün, Abstract Product’u uygular.
  4. Müşteriler, belirli bir Concrete Factory’yi kullanarak nesneleri oluşturabilirler. Bu, müşterinin hangi ailenin nesnelerini kullanmak istediğini belirlemesine olanak tanır.

Bu adımları izleyerek, Abstract Factory Pattern’i kullanarak farklı nesne ailelerini oluşturabilir ve müşterilere bu ailelerden nesneleri döndürebilirsiniz.

Bu tasarım deseni, farklı ailelerden gelen ilgili nesneleri oluşturmak istediğinizde kullanışlıdır. Örneğin, bir restoranın yiyeceklerini ve içeceklerini ele alalım. Bir Amerikan restoranının menüsünde hamburgerler ve sodalar yer alırken, İtalyan bir restoranın menüsünde pizza ve şarap bulunabilir. Her iki restoranın da yiyecek ve içeceklerini oluşturmak için Abstract Factory Pattern kullanabiliriz. Biz örneğimizde ise Java programlama dilini kullanarak, Amerikan restoranı örneği ile ilerleyeceğiz.

Kodlama Örneği

Öncelikle, her yemek ve içecek için bir arayüz veya soyut sınıf tanımlayalım. Bu sınıflar, yemek ve içeceklerin ortak özelliklerini belirtecektir. Örneğin:

// Abstract Product
public interface Food {
    public String getName();
    public double getPrice();
    public List<String> getIngredients();
}

public interface Drink {
    public String getName();
    public double getPrice();
    public int getVolume();
}

Bu arayüzler veya soyut sınıflar, restoranın menüsündeki her yemek veya içecek için somut sınıfların uygulanmasına olanak tanıyacak.

Sonra, somut sınıflarımızı tanımlayalım. Bu sınıflar, arayüz veya soyut sınıfımızı uygulayacak ve restoranın menüsündeki her yemek veya içecek için özel özellikleri belirtecek.

// Concrete Products
public class Hamburger implements Food {
    public String getName() {
        return "Hamburger";
    }

    public double getPrice() {
        return 5.99;
    }

    public List<String> getIngredients() {
        return Arrays.asList("beef", "lettuce", "tomato", "onion");
    }
}

public class HotDog implements Food {
    public String getName() {
        return "Hot Dog";
    }

    public double getPrice() {
        return 3.99;
    }

    public List<String> getIngredients() {
        return Arrays.asList("beef", "bun", "mustard", "ketchup");
    }
}

public class Soda implements Drink {
    public String getName() {
        return "Soda";
    }

    public double getPrice() {
        return 1.99;
    }

    public int getVolume() {
        return 16;
    }
}

public class Juice implements Drink {
    public String getName() {
        return "Juice";
    }

    public double getPrice() {
        return 2.99;
    }

    public int getVolume() {
        return 12;
    }
}

Sonra, fabrika sınıfımızı tanımlayalım. Bu sınıf, restoranın menüsündeki yemekler ve içeceklerin oluşturulmasından sorumlu olacaktır.

// Abstract Factory
public interface RestaurantFactory {
    public Food createFood(String foodType);
    public Drink createDrink(String drinkType);
}

// Concrete Factory
public class AmericanRestaurantFactory implements RestaurantFactory {
    public Food createFood(String foodType) {
        switch (foodType) {
            case "Hamburger":
                return new Hamburger();
            case "HotDog":
                return new HotDog();
            default:
                throw new IllegalArgumentException("Invalid food type: " + foodType);
        }
    }

    public Drink createDrink(String drinkType) {
        switch (drinkType) {
            case "Soda":
                return new Soda();
            case "Juice":
                return new Juice();
            default:
                throw new IllegalArgumentException("Invalid drink type: " + drinkType);
        }
    }
}

Sonrasında ise bu deseni kullanarak bir örneği ve nasıl kullanacağımıza bakalım;

public class Main {
    public static void main(String[] args) {
        // Create an American restaurant
        RestaurantFactory factory = new AmericanRestaurantFactory();

        // Order a hamburger and a soda
        Food food = factory.createFood("Hamburger");
        Drink drink = factory.createDrink("Soda");

        // Display the order
        System.out.println("You ordered a " + food.getName() + " and a " + drink.getName());
        System.out.println("The total cost is $" + (food.getPrice() + drink.getPrice()));
    }
}

Uzun zamandır blog‘um üzerinde yazı yazmıyordum. Bu yazı ile bu serüvenin sonuna gelmişimdir umarım ve bu yazı ile sana bir değer katabilmişimdir.

Sağlıcakla.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir