MERHABA! Bugün tasarım kalıplarını incelemeye devam edeceğiz ve soyut fabrika kalıbını tartışacağız .
İşte derste ele alacaklarımız:
Şimdi bu talimatlara göre kod yazacağı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.
- 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
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ı
onClick
Feragatname: 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.
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:- Ürün ailelerini tanımlayın. Diyelim ki bunlardan iki tane var:
SpecificProductA1
,SpecificProductB1
SpecificProductA2
,SpecificProductB2
- Aile içindeki her ürün için soyut bir sınıf (arayüz) tanımlayın. Bizim durumumuzda, elimizde:
ProductA
ProductB
- Her ürün ailesi içinde, her ürün 2. adımda tanımlanan arabirimi uygulamalıdır.
- 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();
- 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.

// 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:- Kahve siparişi uygulamasını Linux'ta da çalışacak şekilde iyileştirin.
- 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!
GO TO FULL VERSION