Fabrika yöntemi tasarım deseni neden sınıflara sahip olmaktan ve onları ayrı ayrı çağırmaktan daha faydalı?


32

"Dörtlü Çete" tasarım desenlerinden Fabrika yöntemi var:

class Factory(product)
  case product
  when a
    new A
  when b
    new B
  when c
    new C
end

new Factory(a)

Neden bu üç sınıf, sahip olmaktan daha yararlıdır a, bve conları ayrı ayrı arayarak?


1
Tam olarak ne demek istiyorsun? Neden üçünü de başlatmıyorsun? Demek istediğin bu mu?
Neil,

1
@Neil Hayır, fabrika deseninde tüm sınıflar kardeş olarak var. Neden fabrikaya a, b, c sınıflarına dolaylı olarak erişmeleri isteniyor?
alt

3
Bu aslında benim fabrika fabrika modeline benzemiyor, eğer soyut fabrikaya daha yakın bir şey varsa
jk.

2
Çünkü tasarım zamanında hangi 3 sınıftan birini hazırlamanız gerektiğini bilmiyorsunuz.
MrWhite

2
@jk: Hayır, gerçekten değil. programmers.stackexchange.com/questions/81838/…
pdr

Yanıtlar:


54

Çünkü örneğiniz yeterince karmaşık değil. Böyle basit bir senaryo için, gelişmiş bir kalıp kullanmak bile mantıklı gelmiyor.

Ancak, A, B veya C'yi oluşturacak üründen daha fazlasını bilmek zorundaysanız ve bu bilgiye doğrudan erişemiyorsanız, o zaman kullanışlıdır. Daha sonra, gerekli nesneleri üretmek için bir bilgi merkezi olarak hareket etmek için fabrikayı kullanıyorsunuz.

Belki bu nesneler, fabrikanın sağlayabileceği X nesnesine bir referansa ihtiyaç duyar, ancak A, B veya C oluşturmak istediğiniz yerdeki kodunuz X'e erişemez veya erişemez. A ve B'yi yaratırsanız, ancak Y türünüz varsa, C'yi yaratırsınız.

Ayrıca, bazı nesnelerin oluşturmak için 20 bağımlılığa ihtiyaç duyabileceğini de göz önünde bulundurun; sonra ne? Erişilemeyecekleri bir yerde bu bağımlılıkları aramaya gitmek sorunlu olabilir.


13
Fabrika deseninin her zaman en iyi yaklaşım olmadığını açıkça belirtmek için +1.
Neil

1
Çünkü örneğiniz yeterince karmaşık değil. Böyle basit bir senaryo için gelişmiş bir kalıp kullanmak bile mantıklı gelmiyor. Peki bu durumda ne yapardın? Koşullu yapının satır içi?
pdr

Ürünü alan ve tekrar kullanılabilir hale getirmek için ihtiyacınız olanı iade eden bir yöntem olabilir, bu yüzden satır içi olması gerekmez. Eğer böyle bir yöntem daha büyük bir şeye dönüşürse veya başka birkaç sınıfta kullanılıyorsa, farklı sınıflara yeniden aktarabilirsiniz.
Mateusz

Desen bir nedenden dolayı Fabrika Yöntemi olarak adlandırılır. Yöntemin bir Fabrika Yöntemi olması için farklı bir sınıfta olması gerekmez (sık sık olmasına rağmen).
pdr

İçinde "Yöntem" i özledim, bu yüzden haklısın bayım.
Mateusz,

23

Fabrika düzeni genellikle ondan daha karmaşıktır. Bir fabrika hangi koşulların yaratılacağına / iade edeceğine belli kriterler konusunda karar verir. Bunun yerine, fabrikayı kullanmadığınızda, bu kodu tekrar tekrar kodunuzdaki çeşitli yerlerde kullanmış olursunuz.

Örnek olarak, aşağıdakileri göz önünde bulundurun: bir DB'den veri yüklemeniz gerekir, ancak çok sayıda veriyle entegrasyon için bir merkezi DB'ye ve her bir dev-PC'de bellekte daha küçük bir tane vardır. Kodunuzda bir fabrikadan bir DB-kolu almasını isteyin ve fabrika, örneğin bir yapılandırma dosyasına bağlı olarak bunlardan birini döndürür.


20

Fabrika Yöntemi kalıbı, karar verme sürecini çağıran sınıftan soyutlar. Bunun birkaç avantajı var:

Yeniden. Eğer birçok yerde somutlaşmak istersem, durumumu tekrarlamak zorunda değilim, bu yüzden yeni bir sınıf eklemeye geldiğimde, eksik olma riskini taşımam.

Birim-Testedilebilirlik. Doğru koşullarda doğru tiplerin geri döndüğünden emin olmak için fabrika için 3 test yazabilirim, daha sonra çağrı sınıfımın yalnızca fabrika olup olmadığını ve ardından geri dönen sınıfta gerekli yöntemleri aradığını görmek için test edilmesi gerekir. Fabrikanın veya somut sınıfların uygulanması hakkında hiçbir şey bilmemesi gerekiyor.

Genişletilebilirlik. Birisi bu fabrikaya yeni bir D sınıfı eklememiz gerektiğine karar verdiğinde, arama kodlarından hiçbirine, ne birim testlere ne de uygulamaya yönelik hiçbir şey söylenmemelidir. Biz sadece yeni bir D sınıfı yarattık ve fabrika metodumuzu genişlettik. Açık-Kapalı İlkenin tanımı budur .

Durum gerektiriyorsa, yeni bir fabrika sınıfı yaratabilir ve çalışırken değiştirilebilir duruma getirebilirsiniz - örneğin, test ederken D sınıfını açıp kapamak istiyorsanız. Bu duruma yalnızca bir kez rastladım, ancak bu son derece yararlı oldu.

Daha önce de belirtildiği gibi, Fabrika Desenleri her zaman gidecek yol değildir. Ancak, koşullu somutlaştırmayı gördüğünüz her yerde, bir an düşüncesini vermelisiniz.


14

Fabrika modelinin temel avantajları iki yönlüdür:

  1. Bir ürünün uygulanmasına ihtiyaç duyan yerlerin nasıl inşa edileceğini bilmeleri gerekmez. Fabrika bu bilgiyi tutar.

    Belirli bir kurucuya hangi argümanları ilettiğini bilmek ister misiniz? Veya hangi bağımlılıkları enjekte etmeniz gerekiyor? Veya uygulama sınıfı tamamen yapılandırıldıktan sonra veri tabanına nasıl kaydedilir? Yok hayır? Fabrika bütün bunlara baksın.

  2. Bir ürünün uygulanmasına ihtiyaç duyan yerlerin, modül tanımlaması sırasında (yani derleme zamanında) uygulama sınıfının adının ne olduğunu bilmesi gerekmez.

    Bu nedenle, ayapılacak bir şey olması gerekmez A; “ne inşa edileceği” sadece isimle değil, istenen işlevsel olmayan özellikler açısından da tanımlanabilir. Bu çok daha esnektir.

Dezavantajı ise ne yapacağınızı ve nasıl yapacağınızı bildiğiniz yerde, bir fabrika kullanırken daha fazla karmaşıklığa sahip olmanızdır. Bunun düzeltmesi de basittir: mantıklı olmadığında bir fabrika kullanmayın!


2

Tasarım kalıplarını sınıf olarak 'insanlar' olarak düşünmek isterim ve kalıplar insanların birbirleriyle konuşma şekilleridir.

Bu yüzden, bana göre fabrika düzeni bir işe alma ajansı gibidir. Değişken sayıda işçiye ihtiyaç duyacak birine sahipsin. Bu kişi, işe aldıkları kişilerde ihtiyaç duydukları bazı bilgileri biliyor olabilir, ancak bu kadar.

Böylece, yeni bir çalışana ihtiyaç duyduklarında, işe alım ajansını ararlar ve neye ihtiyaçları olduğunu söylerler. Şimdi, aslında birisini işe almak için çok şey bilmeniz gerekiyor - faydalar, uygunluk doğrulaması, vb. Ama işe alan kişinin bunu bilmesi gerekmez - işe alım ajansı bunların hepsini idare eder.

Aynı şekilde, bir Fabrika kullanımı, tüketicinin nasıl yaratıldıklarını ya da bağımlılıklarının ne olduğunu - bilmeden sadece gerçekte istedikleri bilgileri vermek zorunda kalmadan yeni nesneler yaratmalarına izin verir.

Nezaket


1

Fabrika modeli en çok kullanılan ve kötüye kullanılan tasarım desenidir.

Basit bir kurucu yeterli olduğunda, bir Fabrika sınıfının kodlandığı birçok duruma rastladım.

Aşağıdaki durumlarda fabrika sınıfını kullanmayın: -

  • Harici bir kaynağa güveniyorsunuz ancak hangisi henüz tam olarak bilmiyorsunuz.
  • İnşaat pahalıdır ve bir kez inşa edip tekrar tekrar kullanmak istiyorsunuz.
  • Yeni bir örnek oluşturmak, hangi örneklerin önceden oluşturulduğuna bağlıdır (örneğin, yalnızca beş bağlantınız olabilir veya kullanılan son numaradan bir bağlantı kimliği kullanmanız gerekir).

0

Bir alt sınıfı başlatırken Fabrika Yöntemi'ni kullanın ve müşteri kodunun hangi belirli alt sınıfın başlatıldığına karar vermekten sorumlu olması beklenmez.

Hangi sınıfın somutlaştırılacağını değiştirmeniz gerektiğinde, müşteri kodunu değiştirmenizi önlediğinden, kullanışlıdır. Mevcut kodu değiştirmek kötü bir uygulamadır çünkü tipik olarak hataya açıktır.

Bir örnek, her birinin verileri artan düzende, ancak farklı bir biçimde sıraladığı alt sınıflara sahip olmak olabilir. Her yol, belirli bir veri türü için en uygunudur. örneğin: kısmen sıralanmış veriler, sayı olan veriler vb. İstemci kodu, yalnızca veri yazdırmayı işleyen bir sınıftır. İstemci sınıfta hangi sıralama sınıfının somutlaştırılacağına karar veren bir kod olması onu karmaşık bir sınıf haline getirir. Başka bir deyişle, birden fazla sorumluluğu olan bu durumda, hangi sıralama sınıfının en uygun olduğuna karar verme ve veri yazdırma. Hangi sınıflandırma sınıfının bir Fabrika sınıfına atılacağına karar veren kodu koyarak, endişeleri birbirinden ayırır, böylece hangi sınıflandırma alt sınıfının başlatılacağını değiştirmeniz gerektiğinde müşteri sınıfını değiştirmenize gerek kalmaz.

Bu, kıçınızı örtmenin bir yoludur, eğer kendi sınıfında yaptığınız değişikliklerin, nasıl bir sınıfın nasıl yapıldığına ya da nasıl başlatıldığına dair bir çizgi çizebiliyorsanız fabrika sınıflarının kullanımı mantıklı olacaktır. Sınıflarınızın tek sorumlulukları üzerine odaklanmalarına yardımcı olur ve sonuç olarak, ilişkili olmayan mevcut kodu değiştirme zorunluluğunuzun azalmasını sağlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.