CodeGym/Java Blogu/Rastgele/Tasarım desenleri: Soyut fabrika
John Squirrels
Seviye
San Francisco

Tasarım desenleri: Soyut fabrika

grupta yayınlandı
MERHABA! Bugün tasarım kalıplarını incelemeye devam edeceğiz ve soyut fabrika kalıbını tartışacağız . Tasarım desenleri: Soyut fabrika - 1İşte derste ele alacaklarımız:
  • Soyut bir fabrikanın ne olduğunu ve bu modelin hangi sorunu çözdüğünü tartışacağız.
  • Bir kullanıcı arayüzü aracılığıyla kahve sipariş etmek için platformlar arası bir uygulamanın iskeletini oluşturacağız.
  • Bir şemaya ve koda bakmak da dahil olmak üzere, bu kalıbın nasıl kullanılacağına ilişkin talimatları inceleyeceğiz.
  • Ve bir bonus olarak, bu ders, Java'yı işletim sisteminin adını belirlemek ve sonuca bağlı olarak başka bir eylemi gerçekleştirmek için nasıl kullanacağınızı öğrenmenize yardımcı olacak gizli bir Paskalya yumurtası içerir.
Bu kalıbı tam olarak anlamak için aşağıdaki konularda bilgili olmanız gerekir:
  • Java'da kalıtım
  • Java'da soyut sınıflar ve yöntemler

Soyut bir fabrika hangi sorunları çözer?

Soyut bir fabrika, tüm fabrika kalıpları gibi, yeni nesnelerin doğru bir şekilde oluşturulmasını sağlamamıza yardımcı olur. Bunu, birbiriyle bağlantılı çeşitli nesne ailelerinin "üretimini" yönetmek için kullanırız. Birbirine bağlı nesnelerin çeşitli aileleri... Bu ne anlama geliyor? Endişelenmeyin: pratikte her şey göründüğünden daha basit. Başlangıç ​​olarak, birbirine bağlı nesnelerden oluşan bir aile ne olabilir? Farz edelim ki birkaç tür birimi içeren bir askeri strateji geliştiriyoruz:
  • piyade
  • süvari
  • okçular
Bu tür birimler, aynı orduda görev yaptıkları için birbirine bağlıdır. Yukarıda listelenen kategorilerin birbirine bağlı nesneler ailesi olduğunu söyleyebiliriz. Bunu anlıyoruz. Ancak soyut fabrika modeli, birbiriyle bağlantılı çeşitli nesne ailelerinin oluşturulmasını düzenlemek için kullanılır. Burada da karmaşık bir şey yok. Askeri strateji örneğiyle devam edelim. Genel olarak konuşursak, askeri birimler birkaç farklı savaşan tarafa aittir. Kimin tarafında olduklarına bağlı olarak, askeri birimlerin görünümü önemli ölçüde değişebilir. Roma ordusunun piyadeleri, atlıları ve okçuları, Viking piyadeleri, atlıları ve okçuları ile aynı değildir. Askeri stratejide, farklı orduların askerleri birbirine bağlı nesnelerin farklı aileleridir. Bir programcı olsaydı komik olurdu' nın hatası, Napolyon dönemi Fransız üniforması giymiş, tüfeği hazırda bir askerin Roma piyade safları arasında dolaşırken bulunmasına neden oldu. Soyut fabrika tasarım modeli tam da bu sorunu çözmek için gereklidir. Hayır, zaman yolculuğundan kaynaklanabilecek utanç sorunu değil, birbiriyle bağlantılı çeşitli nesne grupları oluşturma sorunu. Soyut bir fabrika, mevcut tüm ürünleri (bir nesne ailesi) oluşturmak için bir arayüz sağlar. Soyut bir fabrikanın tipik olarak birden çok uygulaması vardır. Her biri, ailelerden birinin ürünlerini yaratmaktan sorumludur. Askeri stratejimiz, soyut piyadeler, okçular ve süvariler yaratan soyut bir fabrika ve bu fabrikanın uygulamalarını içerecektir. Örneğin, Roma lejyonerleri yaratan bir fabrika ve Kartacalı askerler yaratan bir fabrika. Soyutlama, bu modelin en önemli yol gösterici ilkesidir. Fabrikanın müşterileri, fabrika ve ürünleriyle yalnızca soyut arayüzler aracılığıyla çalışır. Sonuç olarak, şu anda hangi askerlerin yaratıldığını düşünmenize gerek yok. Bunun yerine, bu sorumluluğu soyut fabrikanın somut bir uygulamasına devredersiniz.

Kahve dükkanımızı otomatikleştirmeye devam edelim

son derste, fabrika yöntemi modelini inceledik. Bunu kahve işimizi genişletmek ve birkaç yeni yer açmak için kullandık. Bugün işimizi modernize etmeye devam edeceğiz. Soyut fabrika modelini kullanarak, çevrimiçi kahve sipariş etmek için yeni bir masaüstü uygulamasının temelini atacağız. Bir masaüstü uygulaması yazarken, her zaman platformlar arası desteği düşünmeliyiz. Uygulamamız hem macOS hem de Windows üzerinde çalışmalıdır (spoiler: Linux desteği ödev olarak uygulamanız için size bırakılmıştır). Uygulamamız nasıl görünecek? Oldukça basit: bir metin alanı, bir seçim alanı ve bir düğmeden oluşan bir form olacaktır. Farklı işletim sistemlerini kullanma deneyiminiz varsa, Windows'taki düğmelerin Mac'tekinden farklı şekilde oluşturulduğunu kesinlikle fark etmişsinizdir. Her şeyde olduğu gibi... Pekala, başlayalım.
  • düğmeler
  • metin alanları
  • seçim alanları
onClickFeragatname: Her arabirimde , onValueChanged, veya gibi yöntemler tanımlayabiliriz onInputChanged. Başka bir deyişle, çeşitli olayları (bir düğmeye basma, metin girme, bir seçim kutusundan bir değer seçme) işlememizi sağlayacak yöntemler tanımlayabiliriz. Örneği aşırı yüklememek ve fabrika modelini incelerken daha net hale getirmek için tüm bunlar burada kasıtlı olarak atlanmıştır. Ürünlerimiz için soyut arayüzler tanımlayalım:
public interface Button {}
public interface Select {}
public interface TextField {}
Her işletim sistemi için, işletim sistemi stilinde arabirim öğeleri oluşturmalıyız. Windows ve MacOS için kod yazacağız. Windows için uygulamalar oluşturalım:
public class WindowsButton implements Button {
}

public class WindowsSelect implements Select {
}

public class WindowsTextField implements TextField {
}
Şimdi aynısını MacOS için yapıyoruz:
public class MacButton implements Button {
}

public class MacSelect implements Select {
}

public class MacTextField implements TextField {
}
Harika. Artık mevcut tüm soyut ürün türlerini oluşturacak olan soyut fabrikamıza geçebiliriz:
public interface GUIFactory {

    Button createButton();
    TextField createTextField();
    Select createSelect();

}
mükemmel. Gördüğünüz gibi, henüz karmaşık bir şey yapmadık. Bundan sonraki her şey de basittir. Ürünlere benzeterek, her işletim sistemi için çeşitli fabrika uygulamaları oluşturuyoruz. Windows'tan başlayalım:
public class WindowsGUIFactory implements GUIFactory {
    public WindowsGUIFactory() {
        System.out.println("Creating GUIFactory for Windows OS");
    }

    public Button createButton() {
        System.out.println("Creating Button for Windows OS");
        return new WindowsButton();
    }

    public TextField createTextField() {
        System.out.println("Creating TextField for Windows OS");
        return new WindowsTextField();
    }

    public Select createSelect() {
        System.out.println("Creating Select for Windows OS");
        return new WindowsSelect();
    }
}
Neler olduğunu daha iyi göstermek için metotların ve yapıcının içine bazı konsol çıktıları ekledik. Şimdi macOS için:
public class MacGUIFactory implements GUIFactory {
    public MacGUIFactory() {
        System.out.println("Creating GUIFactory for macOS");
    }

    @Override
    public Button createButton() {
        System.out.println("Creating Button for macOS");
        return new MacButton();
    }

    @Override
    public TextField createTextField() {
        System.out.println("Creating TextField for macOS");
        return new MacTextField();
    }

    @Override
    public Select createSelect() {
        System.out.println("Creating Select for macOS");
        return new MacSelect();
    }
}
Her yöntem imzasının, yöntemin soyut bir tür döndürdüğünü gösterdiğine dikkat edin. Ancak yöntemlerin içinde, ürünlerin belirli uygulamalarını oluşturuyoruz. Belirli örneklerin oluşturulmasını kontrol ettiğimiz tek yer burasıdır. Şimdi form için bir sınıf yazmanın zamanı geldi. Bu, alanları arabirim öğeleri olan bir Java sınıfıdır:
public class CoffeeOrderForm {
    private final TextField customerNameTextField;
    private final Select coffeeTypeSelect;
    private final Button orderButton;

    public CoffeeOrderForm(GUIFactory factory) {
        System.out.println("Creating coffee order form");
        customerNameTextField = factory.createTextField();
        coffeeTypeSelect = factory.createSelect();
        orderButton = factory.createButton();
    }
}
Arabirim öğeleri oluşturan soyut bir fabrika, formun yapıcısına iletilir. Belirli bir işletim sistemi için arayüz öğeleri oluşturmak üzere gerekli fabrika uygulamasını kurucuya ileteceğiz.
public class Application {
    private CoffeeOrderForm coffeeOrderForm;

    public void drawCoffeeOrderForm() {
        // Determine the name of the operating system through System.getProperty()
        String osName = System.getProperty("os.name").toLowerCase();
        GUIFactory guiFactory;

        if (osName.startsWith("win")) { // For Windows
            guiFactory = new WindowsGUIFactory();
        } else if (osName.startsWith("mac")) { // For Mac
            guiFactory = new MacGUIFactory();
        } else {
            System.out.println("Unknown OS. Unable to draw form :(");
            return;
        }
        coffeeOrderForm = new CoffeeOrderForm(guiFactory);
    }

    public static void main(String[] args) {
        Application application = new Application();
        application.drawCoffeeOrderForm();
    }
}
Uygulamayı Windows üzerinde çalıştırırsak aşağıdaki çıktıyı alırız:
Creating GUIFactory for Windows OS
Creating coffee order form
Creating TextField for Windows OS
Creating Select for Windows OS
Creating Button for Windows OS
Mac'te çıktı aşağıdaki gibi olacaktır:
Creating GUIFactory for macOS
Creating coffee order form
Creating TextField for macOS
Creating Select for macOS
Creating Button for macOS
Linux'ta:
Unknown OS. Unable to draw form :(
Ve şimdi özetliyoruz. Arayüz öğelerinin ilgili işletim sistemi için özel olarak oluşturulduğu GUI tabanlı bir uygulamanın iskeletini yazdık. Yarattığımız şeyi kısaca tekrarlayacağız:
  • Giriş alanı, seçim alanı ve düğmeden oluşan bir ürün ailesi.
  • Ürün ailesinin Windows ve macOS için farklı uygulamaları.
  • Ürünlerimizi oluşturmak için bir arayüzü tanımlayan soyut bir fabrika.
  • Her biri belirli bir ürün ailesi oluşturmaktan sorumlu fabrikamızın iki uygulaması.
  • Alanları, soyut bir fabrika kullanılarak yapıcıda gerekli değerlerle başlatılan soyut arabirim öğeleri olan bir form (bir Java sınıfı).
  • Uygulama sınıfı Bu sınıfın içinde, istenen fabrika uygulamasını kurucusuna ileten bir form oluşturuyoruz.
Sonuç olarak, soyut fabrika modelini uyguladık.

Soyut fabrika: nasıl kullanılır

Soyut bir fabrika, somut ürün sınıflarına bağlı olmadan çeşitli ürün ailelerinin oluşturulmasını yöneten bir tasarım modelidir. Bu kalıbı kullanırken şunları yapmalısınız:
  1. Ürün ailelerini tanımlayın. Diyelim ki bunlardan iki tane var:
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. Aile içindeki her ürün için soyut bir sınıf (arayüz) tanımlayın. Bizim durumumuzda, elimizde:
    • ProductA
    • ProductB
  3. Her ürün ailesi içinde, her ürün 2. adımda tanımlanan arabirimi uygulamalıdır.
  4. 2. adımda tanımlanan her ürünü yaratma yöntemleriyle soyut bir fabrika oluşturun. Bizim durumumuzda bu yöntemler şöyle olacaktır:
    • ProductA createProductA();
    • ProductB createProductB();
  5. Her uygulamanın tek bir ailenin ürünlerinin oluşturulmasını kontrol etmesi için soyut fabrika uygulamaları oluşturun. Bunu yapmak için, soyut fabrikanın her uygulamasında, belirli ürün uygulamalarını oluşturup döndürmeleri için tüm oluşturma yöntemlerini uygulamanız gerekir.
Aşağıdaki UML diyagramı, yukarıda özetlenen talimatları göstermektedir: Tasarım desenleri: Soyut fabrika - 3Şimdi bu talimatlara göre kod yazacağız:
// Define common product interfaces
public interface ProductA {}
public interface ProductB {}

// Create various implementations (families) of our products
public class SpecificProductA1 implements ProductA {}
public class SpecificProductB1 implements ProductB {}

public class SpecificProductA2 implements ProductA {}
public class SpecificProductB2 implements ProductB {}

// Create an abstract factory
public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// Implement the abstract factory in order to create products in family 1
public class SpecificFactory1 implements AbstractFactory {

    @Override
    public ProductA createProductA() {
        return new SpecificProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new SpecificProductB1();
    }
}

// Implement the abstract factory in order to create products in family 2
public class SpecificFactory2 implements AbstractFactory {

    @Override
    public ProductA createProductA() {
        return new SpecificProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new SpecificProductB2();
    }
}

Ev ödevi

Malzemeyi güçlendirmek için 2 şey yapabilirsiniz:
  1. Kahve siparişi uygulamasını Linux'ta da çalışacak şekilde iyileştirin.
  2. Herhangi bir askeri stratejide yer alan birimleri üretmek için kendi soyut fabrikanızı yaratın. Bu, gerçek orduları içeren tarihi bir askeri strateji veya orklar, cüceler ve elfler içeren bir fantezi olabilir. Önemli olan ilginizi çeken bir şey seçmektir. Yaratıcı olun, mesajları konsolda yazdırın ve kalıpları öğrenmenin keyfini çıkarın!
Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok