CodeGym /Java Blogu /Rastgele /Fabrika tasarım deseni
John Squirrels
Seviye
San Francisco

Fabrika tasarım deseni

grupta yayınlandı
Selam dostum! Bugün tasarım modellerini incelemeye devam edeceğiz. Bu dersimizde fabrikalardan bahsedeceğiz. Bu kalıbın çözdüğü sorunu tartışacağız ve bir fabrikanın kahve dükkanı açmanıza nasıl yardımcı olabileceğine dair bir örneğe bakacağız. Ek olarak, size bir fabrika oluşturmak için 5 basit adım vereceğim. Fabrika tasarım deseni - 1 Hepimizin aynı dalga boyunda olduğumuzdan ve bu kavramı hızlı bir şekilde kavrayacağınızdan emin olmak için aşağıdaki konulara aşina olmalısınız:
  • Java'da kalıtım
  • Java'da referans türlerinin daraltılması ve genişletilmesi
  • Farklı sınıflar ve nesneler arasındaki etkileşim.

Fabrika nedir?

Fabrika tasarım deseni, nesnelerin oluşturulmasını kontrol etmenizi sağlar. Yeni bir nesne yaratma süreci çok basit değildir, ancak aşırı derecede karmaşık da değildir. newYeni bir nesne yaratmak için operatöre ihtiyacımız olduğunu hepimiz biliyoruz . Belki de burada kontrol edilecek bir şey yok gibi görünüyor, ama bu doğru değil. Uygulamamızın birçok alt öğesi olan belirli bir sınıfa sahip olduğunu varsayalım. Belirli koşullara bağlı olarak belirli bir sınıfın örneğini oluşturmak gerektiğinde zorluklar ortaya çıkabilir. Fabrika, belirli koşullara bağlı olarak çeşitli nesneler oluşturma sorununu çözmeye yardımcı olan bir tasarım modelidir. Soyut bir kavram için bu nasıl? Aşağıdaki örneğe baktığımızda bu daha net ve daha spesifik hale gelecektir.

Çeşit çeşit kahveler hazırlayalım

Bir kahve dükkanını otomatikleştirmek istediğimizi varsayalım. Programımıza farklı kahve türlerinin nasıl yapıldığını öğretmemiz gerekiyor. Bunu yapmak için, hazırlayacağımız kahve türlerini temsil eden bir kahve sınıfı ve birkaç türevi sınıf oluşturacağız: Americano, cappuccino, espresso ve latte. Genel bir kahve dersiyle başlayalım:

public class Coffee {
    public void grindCoffee(){
        // Grind the coffee
    }
    public void makeCoffee(){
        // Brew the coffee
    }
    public void pourIntoCup(){
        // Pour into a cup
    }
}
Ardından, alt sınıflarını oluşturacağız:

public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
Müşterilerimiz her türlü kahveyi sipariş edebilirler. Emirlerinin programa geçirilmesi gerekiyor. Bu, örneğin kullanılarak birçok şekilde yapılabilir String. Ama enumbunun için an en iyisidir. enumSipariş edilebilecek kahve türlerine karşılık gelen bir numaralandırma alanları oluşturacağız ve tanımlayacağız:

public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
Harika. Şimdi kahvehanemizin kodunu yazalım:

public class CoffeeShop {
    
    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = null;
        
        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucсino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
Yöntem orderCoffeeiki bölüme ayrılabilir:
  1. Açıklamada belirli bir kahve örneğinin oluşturulması switch. Burası bir fabrikanın yaptığı şeyi yaptığı yerdir - koşullara bağlı olarak belirli bir tip oluşturun.
  2. Hazırlık — bu, öğütme, demleme ve bir bardağa dökme işlemidir.
Gelecekte yöntemde değişiklik yapmanız gerekip gerekmediğini bilmeniz gereken önemli noktalar şunlardır:
  1. Hazırlamanın kendisinde yer alan adımlar (öğütme, demleme ve bir bardağa dökme) değişmeden kalacaktır (en azından buna güveniyoruz).
  2. Ancak kahve çeşitleri değişebilir. Belki mocha yapmaya başlarız... Frappu... Mochacci... Her neyse, yeni bir kahve türü.
Gelecekte yöntemin ifadesinde değişiklikler yapmak zorunda kalacağımızdan oldukça emin olabiliriz switch. Ayrıca, kahvehanemizde orderCoffeefarklı kahve türleri oluşturacağımız tek yerin yöntem olmaması da mümkündür. Sonuç olarak, birkaç yerde değişiklik yapılması gerekecektir. Muhtemelen ne demek istediğimi zaten anlamışsınızdır. Yeniden düzenlememiz gerekiyor. Kahve oluşturmaktan sorumlu bloğu iki nedenden dolayı ayrı bir sınıfa taşıyın:
  1. Kahve yapma mantığını başka yerlerde de kullanabiliriz.
  2. Ürün çeşitliliği değişirse, kahvenin üretildiği her yerde kodu düzenlemek zorunda kalmayacağız. Tek bir yerde kodumuzu değiştirmemiz yeterli olacaktır.
Yani fabrika kurmanın zamanı geldi.

İlk fabrikamızı kuruyoruz

Bunu yapmak için, yalnızca gerekli kahve sınıfı örneklerini oluşturmaktan sorumlu olacak yeni bir sınıf oluşturacağız:

public class SimpleCoffeeFactory {
    public Coffee createCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }
        
        return coffee;
    }
}
Tebrikler! Fabrika tasarım modelini en basit haliyle (neredeyse) az önce hayata geçirdik. Yöntemi statik yapsaydık daha da basit olabilirdi createCoffee. Ancak o zaman iki yeteneğimizi kaybederiz:
  1. SimpleCoffeeFactoryYöntemi devralma ve geçersiz kılma yeteneği createCoffee.
  2. Gerekli fabrika uygulamasını sınıflarımıza ekleyebilme.
Bu arada uygulama demişken... Kahveciye dönüp kahve fabrikamızı eklememiz gerekiyor.

Kahve dükkanına fabrika ekleme

Kahve dükkanı sınıfını bir fabrika kullanarak yeniden yazalım:

public class CoffeeShop {

    private final SimpleCoffeeFactory coffeeFactory;

    public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
        this.coffeeFactory = coffeeFactory;
    }

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = coffeeFactory.createCoffee(type);
        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
Harika. Şimdi fabrika tasarım modelinin genel yapısının kısa bir açıklamasını sağlayacağız.

Kendi fabrikanızı açmak için 5 adım

Adım 1. Programınız, aşağıdaki şemada gösterildiği gibi, birkaç alt sınıfa sahip bir sınıfa sahiptir: Adım 2. Her alt sınıf için bir alan Fabrika tasarım deseni - 2oluşturursunuz :enum

    enum CatType {
        LION,
        TIGER,
        FLUFFY
    }
Adım 3. Fabrikanızı kurun. Ara CatFactory. İşte kod:

class CatFactory {}
Adım 4. Fabrikanızda, bağımsız değişken createCatalan bir yöntem oluşturun CatType. İşte kod:

    class CatFactory {
        public Cat createCat(CatType type) {
            
        }
    }
Adım 5. Yöntemin gövdesine, switchenum alanlarını sıralayan ve iletilen değere karşılık gelen sınıfın bir örneğini oluşturan bir ifade yazın enum:

class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;
            
            switch (type) {
                case LION:
                    cat =  new Fluffy();
                    break;
                case TIGER:
                    cat = new Tiger();
                    break;
                case FLUFFY:
                    cat =  new Lion();
                    break;
            }
            
            return cat;
        }
    }
Artık bir fabrikayı patron gibi yönetebilirsiniz. :)

nasıl pratik yapılır

Okumak iyidir, kod yazmak daha da iyidir. Adınızda çift sayıda harf varsa, kendi sanal pizzacınızı oluşturmayı deneyin. Adınızda tek sayıda harf varsa, sanal bir suşi barı oluşturmayı deneyin. Eğer bir adınız yoksa, şanslısınız. Bugün rahatlayabilirsiniz.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION