Yaratıcı Model: Soyut Fabrika
Burada, bir ürün ailesini esnek ve genişletilebilir bir şekilde oluşturmamızı sağlayan kreatif bir tasarım modelini ayrıntılarıyla anlatan bir makale bulunmaktadır.
Bu ne?
Son makalede, fabrika yöntemi modelini öğrendik . Daha sonra F-16'nın varyantlarını fabrika metodu ile nasıl modelleyebileceğimizi gördük. Ancak bu makale, F-16 dışındaki çok sayıda uçağın nasıl temsil edileceğini ele alacaktır. Örneğin, bir müşterinin CEO'sunun seyahat etmesi için bir Boeing 747 satın aldığını ve yazılımınızın bu yeni uçak tipini desteklemesini istediğini varsayalım.
Soyut fabrika modeli, ilgili ürün ailelerini oluşturma sorununu çözer. Örneğin F-16'nın motora, kokpite ve kanatlara ihtiyacı var. Boeing-747 aynı parçaları gerektirecek, ancak bunlar Boeing'e özgü olacaktır. Herhangi bir uçağın bu üç ilgili parçaya ihtiyacı olacaktır; ancak parçalar uçağa özgü olacaktır. Burada ortaya çıkan bir model görebiliyor musunuz? İlk olarak, her uçak için ilişkili parçaları oluşturmak için bir çerçeveye ihtiyacımız var.
Soyut fabrika modeli, somut sınıflarını belirtmeden ilgili veya bağımlı nesnelerin ailelerini oluşturmanıza izin veren bir tasarım modelidir.
Sınıf diyagramı
Sınıf diyagramı aşağıdaki varlıkları içerir:
- soyut fabrika
- Beton Fabrikası
- Soyut Ürün
- Beton Ürün
- Müşteri
Soyut fabrika modeli, somut sınıflarını belirtmeden ilgili nesnelerden oluşan bir aile oluşturmanıza olanak tanır. Bir örnek düşünelim. Havacılık endüstrisi için simülasyon yazılımı oluşturduğunuzu ve farklı uçakları nesneler olarak temsil etmeniz gerektiğini varsayalım. Ancak bir uçağı temsil etmeden önce, uçağın diğer parçalarını da nesne olarak tanımlamanız gerekir. Üç tane seçelim: kanatlar, kokpit ve motor. Şimdi, temsil etmek istediğiniz ilk uçağın kudretli F-16 olduğunu söyleyin. Muhtemelen F-16'ya özgü her parça için bir tane olmak üzere üç sınıf yazacaksınız. Kodunuzda, muhtemelen şu şekilde yeni oluşturulan bu üç sınıfı kullanacaksınız:
Bu kod parçacığı zararsız görünür, ancak simülasyon yazılımınız çalışırsa ve onu diğer uçaklara genişletmeniz gerekirse ciddi baş ağrılarına neden olabilir. Yukarıdaki kodla ilgili sorunlardan bazıları şunlardır:
- Üç parça için beton sınıfları doğrudan tüketiciye sunulmuştur.
- F-16'nın farklı motorlara sahip birkaç çeşidi vardır. Varyantla eşleşen bir motor nesnesi döndürmek istiyorsanız F-16Engine sınıfını alt sınıfa ayırmanız gerekir, bu da tüketici snippet'inin değiştirilmesini gerektirir.
- Kod parçacığındaki Liste, somut bir sınıfla parametreleştirilmiş olarak bildirilir; Programınıza başka bir uçak motoru eklerseniz, tüm uçaklar için motorlar bir şekilde benzer olsa da, bu, Liste tarafından tanınmaz.
Arayüzü bir uygulama yerine soyut bir kavram olarak ele alın
İyi nesne yönelimli tasarım, uygulamanızda kullanılan somut sınıfları gizlemek ve arayüzleri istemcilere göstermek anlamına gelir. Bir nesne, nesnenin sınıfı tarafından uygulanan bir arabirim tarafından yakalanabilen bir dizi isteklere yanıt verir. Müşteriler, uygulama yerine bir nesnenin hangi taleplere yanıt verdiğini bilmelidir.
Örneğimizde, start() adlı bir yöntemi ortaya çıkaran bir arabirim oluşturacağız . F16Engine sınıfı daha sonra şu şekilde değişecektir:
İlgili tüketici kodunun yukarıdaki değişiklikle nasıl değiştiğini görün.
Tüketici kodu artık F-16 motorunun nasıl çalıştığına ve hangi sınıfın onu uyguladığına ilişkin uygulama ayrıntılarından muaftır. Ancak yine de kodun F16Engine() kısmını göstermek istemiyoruz . Tüketicilerimizin hangi sınıfı somutlaştırdığımız hakkında tahminde bulunmalarını sağlamak istiyoruz. Bu daha sonra tartışılacaktır.
fabrika oluşturmak
İstemci kodunda nesneler oluşturmak yerine, istenen nesneleri yaratan ve bunları istemciye geri döndüren bir fabrika sınıfımız olacak. Bu sınıfı F16Factory olarak adlandıracağız çünkü F16 askeri uçağının çeşitli parçalarını üretebilir ve talep eden müşteriye teslim edebilir. Sınıf aşağıdaki şekli alacaktır.
Şimdi, F16Factory nesnesini istemci koduna yapıcı bağımsız değişkeni olarak ilettiğimizi ve ardından şuna benzer nesneler yaratabildiğini varsayalım:
Bu kurulumun, F16Engine arabirimini taahhüt ettiği sürece F16Engine'i temsil eden somut sınıfı değiştirmemize nasıl izin verdiğine dikkat edin . İstemcide büyük bir değişikliğe neden olmadan sınıfımızı yeniden adlandırabilir, geliştirebilir veya değiştirebiliriz. Ayrıca, yalnızca istemci kurucuya iletilen fabrika sınıfını değiştirerek müşteriye tamamen yeni bir uçak için farklı parçalar sağlayabileceğimizi unutmayın.
Fabrika Fabrikası: Diğer fabrikaları yapan büyük fabrika
Boeing 747 veya Rus MiG-29 gibi farklı uçak türleri için aynı istemci parçacığını kullanmak harika olmaz mıydı ? createEngine() uygulayan tüm fabrikalar standart bir arayüz üzerinde anlaşırsa, müşteri kodumuz tüm uçak fabrikaları için çalışmaya devam edecektir. Ancak tüm fabrikalar, yöntemlerini uygulayacakları bu ortak arayüze bağlı kalmak zorunda kalacak ve bu tanıdık arayüz, soyut bir fabrikadır .
uygulama
Farklı uçak fabrikalarının uygulaması gereken yöntemleri tanımlayan bir arayüzle başlayalım. İstemci kodu bu arayüze karşı yazılır, ancak çalışma zamanında somut bir fabrika ile oluşturulacaktır.
Arayüzden bahsettiğimizde , bir Java arayüzünü veya soyut bir sınıfı kastediyoruz. Bu durumda, herhangi bir ürün için varsayılan uygulamalar olsaydı, soyut bir sınıf kullanabilirdik. Oluşturma yöntemleri somut ürünler döndürmez — fabrika tüketicilerini parçaların somut uygulamasından ayırmak için arayüzler döndürürler.
Soyut fabrika modelinin resmi tanımı, somut sınıfları belirtmeden ilgili ürün ailelerini oluşturmak için bir arayüz tanımlayan bir tasarım modeli olduğunu söyler. Bu durumda, IAircraftFactory bu arabirimdir ve oluşturma yöntemleri önemli parçalar döndürmez, somut parçaların sınıfları tarafından uygulanan arabirimlerdir.
Ardından, iki uçağımız için fabrikaları kuralım.
Bir beton fabrikasında F-16 veya Boeing'e özel motor, kokpit ve kanatlar üretilecek. Her parçanın, kısa olması için burada listelemediğimiz karşılık gelen bir ürün arayüzü vardır. Parçaları temsil eden ürün arayüzleri şöyle olacaktır:
IEngineICockpitIWings
Önceki makalede , F-16 için fly() yöntemini içeren bir sınıf oluşturduk . Bu yöntem , F-16'nın bir örneğini oluşturan makeF16()'yı ve sonra taxi()'yi çağırır . Piste çıktıktan sonra uçup gitti. Aynı yaklaşımı Boeing-747 örneğimize de uygulayabiliriz. Tüm uçaklar aynı modeli takip eder: imal edilin, pistte taksi yapın ve sonra uçup gidin. Böylece bu üç görevi yerine getiren bir uçak için bir sınıf oluşturabiliriz. İki uçağı (yani, F-16 ve Boeing-747) temsil etmek için ayrı sınıflar değil, her ikisini de temsil edebilecek tek bir Uçak sınıfı oluşturduğumuza dikkat edin.
Şimdilik makeAircraft yöntemini boş bırakacağız. Öyleyse önce bir müşterinin F-16 ve Boeing-747 nesnelerini nasıl talep edeceğini görelim.
Aircraft sınıfımıza bir oluşturucu eklemek için , fabrika adında yeni bir örnek değişken oluşturmamız gerekecek. Fabrika, uçak parçaları oluşturmaktan sorumlu olacak nesneyi depolar. Uçak nesnesini başka bir fabrika ile birleştirerek farklı bir uçak elde edebiliriz. Uçak sınıfının tam versiyonu aşağıdadır:
İstemci, Aircraft sınıfına geçtiği doğru fabrikayı somutlaştırmalıdır . Uçak sınıfı istemciyi temsil eder. Fabrikamızın oluşturabileceği tüm uçakları temsil edecek bir IAircraft arayüzü oluşturabilirdik , ancak sınırlı örneğimiz için bu gereksiz.
Ortaya çıkan kod kolayca genişletilir ve değiştirilir.
Örneğimize fabrika yöntemi kalıp makalesinden devam edecek olursak, F-16'nın A ve B varyantları için fabrikalar oluşturmak üzere F16Factory sınıfını alt sınıf olarak kullanabilir veya varyant modelini belirten bir enum ile parametrelendirebilir ve bir anahtarda doğru parçayı döndürebiliriz. Beyan.
Diğer Örnekler
- Soyut fabrika modeli, ilgili ürün ailelerinin oluşturulmasına yardımcı olur. Örneğin, kitaplığınız şık UI pencere öğeleri sağlıyorsa ve macOS ile Windows'u destekliyorsa, bu platformlarda çalışan bir ürün ailesine ihtiyacınız olabilir. Benzer şekilde IDE'lerde kullanılan temalar da başka bir örnek olabilir. Örneğin, IDE'niz açık ve koyu temaları destekliyorsa, parçacıkları yapan somut fabrikayı değiştirerek açık veya koyu temaya ait parçacıklar oluşturmak için soyut fabrika modelini kullanabilir.
javax.xml.parsers.DocumentBuilderFactory.newInstance()size bir fabrika döndürecek.javax.xml.transform.TransformerFactory.newInstance()size bir fabrika döndürecek.
- Fabrika yöntemi ve soyut fabrika modeli, nesne oluşturmayı yönetmeye yardımcı olmaları bakımından benzerdir. İki kalıp arasındaki fark, motivasyonlarında yatmaktadır. Fabrika yöntemi modeli genellikle tek bir ürün oluşturmaktan sorumluyken, soyut bir fabrika modeli tüm ilgili ürün ailelerini oluşturur. Ayrıca, daha özel ürünler oluşturmak için fabrika yöntemi modelinde kalıtımı kullanıyoruz. Son olarak, istenen sonuçları oluşturmak için tüketilen fabrikalara geçerek soyut bir fabrika modelinde nesne kompozisyonu uyguluyoruz.
- Filomuza yeni bir uçak eklediğimizde beton fabrikası kuruyoruz. Ancak filoya bir helikopter eklendiğini ve bir uçakta olmayan bir parça gerektirdiğini varsayalım. O halde sadece helikopterin ihtiyaç duyduğu kısım için IAircraftFactory arayüzünü başka bir yaratıcı yöntemle genişletmemiz gerekecek. Bu, yeni bileşen jetlerin bir parçası olmadığından null döndürmesi gereken mevcut fabrikalardaki değişikliği basamaklandıracaktır.
- Beton fabrikaları en iyi şekilde tekil nesneler olarak uygulanır.

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































