Doğrudan nesne yapımı yerine neden fabrika sınıfı kullanmalıyım?


162

GitHub ve CodePlex'te birçok С # ve Java sınıfı kütüphane projesinin tarihini gördüm ve doğrudan nesne örneklemesinin aksine fabrika sınıflarına geçme eğiliminde olduğumu görüyorum.

Fabrika sınıflarını neden yoğun kullanmalıyım? Nesnelerin eski moda yöntemlerle yaratıldığı oldukça iyi bir kütüphanem var - sınıfların kurucularını çağırarak. Son olarak, yazarlar binlerce sınıfın bütün kamu kurucularını içselliğe çabucak değiştirdi ve ayrıca CreateXXXsınıfların iç yapıcılarını çağırarak yeni nesneler döndüren binlerce statik yöntemle büyük bir fabrika sınıfı yarattı . Dış proje API'si bozuldu, aferin.

Neden böyle bir değişiklik faydalı olabilir? Bu şekilde yeniden yapılanmanın amacı nedir? Çağrıları genel sınıf kurucularına statik fabrika yöntemi çağrılarıyla değiştirmenin yararları nelerdir?

Kamu yapıcılarını ne zaman kullanmalıyım ve fabrikaları ne zaman kullanmalıyım?



1
Kumaş sınıfı / yöntemi nedir?
Doval,

Yanıtlar:


56

Fabrika sınıfları, genellikle projenin SOLID ilkelerini daha yakından takip etmesine izin verdiği için uygulanır . Özellikle, arayüz ayrımı ve bağımlılık inversiyon ilkeleri.

Fabrikalar ve arayüzler çok daha uzun süreli esneklik sağlar. Daha dekuplajlı ve bu nedenle daha fazla test edilebilir - tasarıma izin verir. Bu yolda neden aşağıya inebileceğinizin ayrıntılı bir listesi:

  • Kolayca bir Inversion of Control (IoC) konteyneri eklemenizi sağlar
  • Arayüzlerle dalga geçebileceğinizden kodunuzu daha test edilebilir kılar
  • Uygulamayı değiştirme zamanı geldiğinde size daha fazla esneklik kazandırır (yani bağımlı kodu değiştirmeden yeni uygulamalar oluşturabilirsiniz)

Bu durumu düşünün.

Meclis A (-> anlamına gelir):

Class A -> Class B
Class A -> Class C
Class B -> Class D

B Sınıfını Meclis A'ya bağlı olan B Meclisine taşımak istiyorum. Bu somut bağımlılıklarla tüm sınıf hiyerarşimin çoğunu taşımak zorundayım. Arabirimler kullanırsam, acıdan çok kaçınabilirim.

Meclis A:

Class A -> Interface IB
Class A -> Interface IC
Class B -> Interface IB
Class C -> Interface IC
Class B -> Interface ID
Class D -> Interface ID

Artık B sınıfını, hiçbir ağrısız olarak B montajına taşıyabilirim. Hala montaj A'daki arayüzlere bağlı.

Bağımlılıklarınızı çözmek için bir IoC kabı kullanmak size daha fazla esneklik sağlar. Sınıfın bağımlılıklarını değiştirdiğinizde her çağrıyı kurucuya güncellemeye gerek yoktur.

Arabirim ayrıştırma ilkesini ve bağımlılık inversiyon ilkesini izleyerek, son derece esnek, ayrıştırılmış uygulamalar oluşturmamızı sağlar. Bu tür uygulamalardan biri üzerinde çalıştıktan sonra, newanahtar kelimeyi tekrar kullanmak istemeyeceksiniz .


40
IMO fabrikaları SOLID için en önemli şey. SOLID'i fabrikalar olmadan gayet iyi yapabilirsiniz.
Öforik

26
Bana hiç mantıklı gelmeyen şeylerden biri, eğer fabrikaları yeni nesneler yapmak için kullanıyorsanız, o zaman fabrikayı ilk etapta yapmak zorundasınız . Peki bu seni tam olarak ne elde ediyor? Kendi başınıza somutlaştırmak yerine başka birinin size fabrikayı vereceği varsayılıyor mu? Bu cevapta belirtilmelidir, aksi takdirde fabrikaların aslında herhangi bir sorunu nasıl çözdükleri açık değildir.
Mehrdad,

8
@ BЈовић - Her yeni bir uygulama eklediğinizde, şimdi fabrikayı açacak ve yeni uygulamayı hesaba katacak şekilde değiştireceksiniz - açıkça OCP'yi ihlal ediyor.
Telastyn

6
@Telastyn Evet, ancak oluşturulan nesneleri kullanan kod değişmez. Fabrikadaki değişikliklerden sonra bu daha önemlidir.
BЈовић

8
Fabrikalar, cevabın ele alındığı belirli alanlarda faydalıdır. Her yerde kullanmaya uygun değillerdir . Örneğin, dizeler veya listeler oluşturmak için fabrikaları kullanmak çok ileri gidiyor. UDT'ler için bile her zaman gerekli değildir. Anahtar, bir arabirimin tam olarak uygulanmasının ayrıştırılması gerektiğinde bir fabrika kullanmaktır.

126

Gibi whatsisname dedi, ben bunun böyle olduğuna inanıyorum kargo kült yazılım tasarımı. Fabrikalar, özellikle de soyut tür, yalnızca modülünüz bir sınıfın birden çok örneğini oluşturduğunda ve bu modülün kullanıcısına hangi türün yaratılacağını belirleme yeteneği vermek istediğinizde kullanılabilir. Bu gereksinim aslında oldukça nadirdir, çünkü çoğu zaman sadece bir örneğe ihtiyacınız vardır ve bu örneği doğrudan açık bir fabrika oluşturmak yerine doğrudan geçebilirsiniz.

Mesele şu ki, fabrikaların (ve tektonların) uygulanması son derece kolaydır ve bu yüzden insanlar gerekmediği yerlerde bile onları çok kullanırlar. Peki programcı "Bu kodda hangi tasarım desenlerini kullanmalıyım?" Fabrika ilk akla gelen şey.

Pek çok fabrika kuruldu çünkü "Belki bir gün, bu sınıfları farklı şekilde yaratmam gerekecek". Bu YAGNI'nın açık bir ihlalidir .

IoC çerçevesini tanıttığınızda fabrikalar modası geçmiş oluyor, çünkü IoC sadece bir tür fabrika. Ve birçok IoC çerçevesi, belirli fabrikaların uygulamalarını oluşturabilir.

Ayrıca, CreateXXXyalnızca yapıcı olarak adlandırılan yöntemlerle devasa statik sınıflar oluşturduğunu söyleyen bir tasarım deseni yoktur . Ve özellikle bir Fabrika (ne de Soyut Fabrika) olarak adlandırılmaz.


6
"IoC bir tür fabrika" dı ndakilerinizin çoğu ile aynı fikirdeyim : IoC konteynerleri fabrika değildir . Bağımlılık enjeksiyonunu başarmak için uygun bir yöntemdir. Evet, bazıları otomatik fabrikalar kurabilirler, ancak fabrikaların kendileri değildir ve böyle muamele görmemelidirler. Ben de YAGNI noktasını tartışırdım. Birim testinizde bir test çiftinin yerini alabilmeniz yararlı olacaktır. Gerçeği sonra bunu sağlamak için her şeyi yeniden düzenlemek götteki bir acıdır . Önceden planlayın ve "YAGNI" bahane düşmez
AlexFoxGill

11
@AlexG - eh ... pratikte, neredeyse tüm IoC konteynerleri fabrika olarak çalışmaktadır.
Telastyn

8
@AlexG IoC'nin ana odağı, yapılandırma / sözleşmeye bağlı olarak diğer nesnelere geçmek için somut nesneler oluşturmaktır. Bu fabrika kullanmakla aynı şey. Ve test için alay oluşturabilmek için fabrikaya ihtiyacınız yok. Siz sadece örneği başlatır ve sahneyi doğrudan iletirsiniz. İlk paragrafta dediğim gibi. Fabrikalar yalnızca, bir örneğin oluşturulmasını, fabrikayı çağıran modül kullanıcısına aktarmak istediğinizde kullanışlıdır.
Öforik

5
Yapılacak bir ayrım var. Fabrika deseni bir programın çalışma zamanı sırasında nesneler yaratmak için bir tüketici tarafından kullanılır. Program başlangıcında programın nesne grafiğini oluşturmak için bir IoC kabı kullanılır. Bu elle yapabilirsiniz, konteyner sadece bir kolaylık sağlıyor. Bir fabrikanın tüketicisi IoC konteynerinin farkında olmamalıdır.
AlexFoxGill

5
Re: "Ve test için bir alay oluşturabilmek için fabrikaya ihtiyacınız yok. Sahneyi doğrudan başlatıp doğrudan geçebilirsiniz" - tekrar, farklı koşullar. Bir örnek talep etmek için bir fabrika kullanıyorsunuz - tüketici bu etkileşimin kontrolünü elinde tutuyor. Yapıcı veya yöntem yoluyla bir örnek vermek işe yaramıyor, farklı bir senaryo.
AlexFoxGill

79

Factory pattern vogue, "C-style" dillerinde (C / C ++, C #, Java) kodlayıcılar arasında "yeni" anahtar kelimenin kullanımının kötü olduğu ve her ne pahasına (veya en az merkezileşmiş). Bu da, Tek Sorumluluk İlkesinin (SOLID'in “S” si) ve ayrıca Bağımlılık İnversiyon İlkesinin (“D”) ultra katı bir yorumundan kaynaklanmaktadır. Basitçe ifade etmek gerekirse, SRP ideal olarak bir kod nesnesinin bir "değişim sebebi" ve bir tanesinin olması gerektiğini söyler; Bu "değişim nedeni", bu nesnenin temel amacı, kod tabanında "sorumluluğu" ve kodda değişiklik gerektiren başka bir şey, bu sınıf dosyasını açmayı gerektirmemelidir. DIP daha da basittir; Bir kod nesnesi asla başka bir somut nesneye bağlı olmamalıdır,

"Yeni" ve bir kamu kurucusu kullanarak, çağrı kodunu belirli bir somut sınıfın belirli bir yapım yöntemine bağlıyorsunuz. Kodunuz artık bir MyFooObject sınıfının var olduğunu bilmeli ve bir dize ve int alan bir yapıcıya sahip olmalıdır. Eğer bu kurucu daha fazla bilgiye ihtiyaç duyuyorsa, şu anda yazdığınız bilgiler de dahil olmak üzere bu bilgileri aktarmak için kurucunun tüm kullanımlarının güncellenmesi gerekir ve bu nedenle geçmek için geçerli bir şeyleri olması gerekir. onu almak için veya değiştirilerek (tüketen nesnelere daha fazla sorumluluk eklenmesi). Ayrıca, eğer MyFooObject, daha önce BetterFooObject tarafından kod tabanında değiştirilirse, eski sınıfın tüm kullanımlarının eskisinin yerine yeni nesneyi oluşturmak için değişmesi gerekir.

Bu nedenle, MyFooObject'in tüm tüketicileri, MyFooObject dahil sınıfları uygulama davranışını tanımlayan "IFooObject" e doğrudan bağlı olmalıdır. Şimdi, IFooObjects tüketicileri sadece bir IFooObject inşa edemezler (belirli bir somut sınıfın bir IFooObject olduğunu, ihtiyaç duymadıkları bir IFooObject olduğu bilgisine sahip olmadan), bu nedenle bunun yerine bir IFooObject-uygulayan sınıf veya yöntem örneği verilmelidir Dışarıdan, bizim durumumuzda genellikle bir Fabrika olarak bilinen durum için doğru IFooObject'in nasıl yaratılacağını bilmek sorumluluğuna sahip başka bir nesne tarafından.

Şimdi, işte teori gerçeği buluştuğu yer; bir nesne, her zaman her türlü değişikliğe asla kapatılamaz. İddiaya bakıldığında, IFooObject artık tüketicilerin talep ettiği arayüz veya IFooObjects uygulamaları değiştiğinde değişmesi gereken kod tabanındaki ek bir kod nesnesidir. Bu, nesnelerin bu soyutlama boyunca birbirleriyle etkileşimlerini değiştirme biçimiyle ilgili yeni bir karmaşıklık düzeyi ortaya koyuyor. Ayrıca, arayüzün kendisi yenisiyle değiştirilirse, tüketiciler hala değişmek zorunda kalacaklardır.

İyi bir kodlayıcı, YAGNI'yi ("İhtiyacınız Olmayacak") SOLID ile nasıl dengeleyeceğini, tasarımı analiz ederek ve belirli bir şekilde değişmesi muhtemel olan yerleri bularak ve onları daha hoşgörülü hale getirerek bilir. değişimin bu tip bu durumda çünkü "sen olan edeceksin gerek."


21
Diğerlerini okuduktan sonra özel olarak bu cevabı seviyorum. Neredeyse (iyi) yeni kodlayıcıların, prensipler hakkında gerçekten iyi olmak istedikleri, ancak öğrendiklerinin henüz basit olmadığı ve her şeyi basitleştirmenin değerini bilmediğim için çok fazla dogmatik olduğunu ekleyebilirim.
jean

1
Kamu kurucuları ile ilgili diğer bir problem, bir sınıfın Foobir kamu kurucusunu belirtmesi için iyi bir yol bulunmaması , Fooörneklerin yaratılması için ya da aynı paket / derlemede başka türlerin yaratılması için kullanılabilir olması, ancak oluşturulması için kullanılmaması gerektiğidir. başka bir yerde türetilmiş türleri. Bir dilin / çerçevenin newifadelerde kullanmak için alt yapıcılardan çağrılmak yerine, ayrı yapıcılar tanımlayamadığı özellikle zorlayıcı bir neden bilmiyorum , ancak bu ayrımı yapan herhangi bir dil bilmiyorum.
supercat

1
Korumalı ve / veya dahili bir kurucu böyle bir sinyal olacaktır; Bu yapıcı yalnızca bir alt sınıfta veya aynı montaj içinde kod tüketmek için uygun olacaktır. C # "korumalı ve dahili" için bir anahtar kelime kombinasyonuna sahip değildir, yani sadece meclis içindeki alt tipleri kullanabilir, ancak MSIL bu tür görünürlük için bir kapsam tanımlayıcısına sahiptir, böylece C # spesifikasyonunu kullanmanın bir yolunu sağlayacak şekilde genişletilebilir . Ancak, bunun fabrikaların kullanımı ile pek bir ilgisi yok (bir fabrika kullanımını zorlamak için görünürlük kısıtlamasını kullanmadığınız sürece).
KeithS

2
Mükemmel cevap. 'Teori gerçeklikle buluşuyor' kısmına tam olarak dikkat edin. Sadece binlerce geliştiricinin ve insanın zamanının kargo-kültü övdüğünü, haklı çıkardığını, uyguladığını, daha sonra tanımladığınız duruma düşerek kullandığını düşünün, sadece çıldırtıcı. YAGNI’yi takiben bir fabrika
kurma

OOP uygulamasının yapıcıya aşırı yüklenmesine izin vermediği için kamu yapıcılarının kullanımı etkili bir şekilde yasaklandığı bir kod tabanında programlama yapıyorum. Bu zaten izin veren dillerde küçük bir sorundur. Sıcaklık yaratmak gibi. Hem Fahrenheit hem de Celsius yüzerdir. Bununla birlikte, bunları kutlayabilirsiniz, ardından problem çözüldü.
jgmjgm

33

Yapıcılar kısa, basit kod içerdiklerinde iyidirler.

Başlatma, alanlara birkaç değişken atamaktan daha fazlası olduğunda, bir fabrika mantıklı olur. İşte faydalarından bazıları:

  • Uzun, karmaşık kod adanmış bir sınıfta (bir fabrika) daha anlamlı olur. Aynı kod, bir grup statik yöntemi çağıran bir yapıcıya verilirse, bu ana sınıfı kirletir.

  • Bazı dillerde ve bazı durumlarda, yapıcılara istisnalar atmak , hataya neden olabileceği için gerçekten kötü bir fikirdir .

  • Bir yapıcı çağırdığınızda, arayan kişi, oluşturmak istediğiniz örneğin türünü bilmeniz gerekir. Bu (a olarak her zaman böyle değildir Feeder, sadece inşa gerekir Animal; bu bir olması umurumda değil beslemek amacıyla Dogveya Cat).


2
Seçenekler yalnızca "fabrika" veya "kurucu" değildir. A Feederikisini de kullanamaz ve bunun yerine Kennelnesnesinin getHungryAnimalyöntemini çağırır .
DougM

4
+1 Bir kurucuda kesinlikle hiçbir mantık kuralına uymanın kötü bir fikir olmadığını tespit ediyorum. Bir yapıcı, yalnızca argüman değerlerini örnek değişkenlerine atayarak nesnenin başlangıç ​​durumunu ayarlamak için kullanılmalıdır. Daha karmaşık bir şeye ihtiyaç duyulursa, en azından örneği oluşturmak için bir fabrika (sınıf) yöntemi kullanın.
KaptajnKold,

Burada gördüğüm tek tatmin edici cevap, kendimi yazmak zorunda kalmamdan kurtardı. Diğer cevaplar sadece soyut kavramlarla ilgileniyor.
TheCatWhisperer

Ancak bu argüman için de geçerli olabilir Builder Pattern. Öyle değil mi?
soufrk

İnşaatçılar kuralı
Breno Salgado

10

Arayüzlerle çalışıyorsanız, gerçek uygulamadan bağımsız kalabilirsiniz. Bir fabrika, çeşitli uygulamalardan birini örneklemek için (özellikler, parametreler veya başka bir yöntemle) yapılandırılabilir.

Basit bir örnek: bir cihazla iletişim kurmak istiyorsunuz ancak bunun Ethernet, COM veya USB üzerinden olup olmayacağını bilmiyorsunuz. Bir arayüz ve 3 uygulama tanımladınız. Çalışma zamanında, istediğiniz yöntemi seçebilir ve fabrika size uygun uygulamayı verecektir.

Sık kullan ...


5
Bir arabirimin birden fazla uygulaması olduğunda ve arama kodunun hangisini seçeceğini bilmemesi veya bilmemesi durumunda kullanmanın harika olduğunu ekleyeceğim . Fakat bir fabrika metodu, soruda olduğu gibi sadece tek bir kurucu etrafında statik bir sarmalayıcı olduğunda , bu anti-paterndir. Orada olmak zorunda almaya veya fabrika engel ve gereksiz karmaşıklığı ekliyor hangi çoklu uygulamalar.

Artık daha fazla esnekliğe sahipsiniz ve teoride uygulamanız Ethernet, COM, USB ve seri kullanabiliyor, teorik olarak fireloop ya da her neyse hazır. Gerçekte, uygulamanız yalnızca Ethernet üzerinden iletişim kurar .... hiç.
Pieter B

7

Java / C # modül sistemlerinde bir sınırlama belirtisidir.

Prensip olarak, aynı kurucu ve yöntem imzalarıyla bir sınıfın bir uygulamasını bir başkasıyla değiştirememeniz için hiçbir neden yoktur. Orada olan buna izin dilleri. Bununla birlikte, Java ve C #, her sınıfın benzersiz bir tanımlayıcıya (tam nitelikli ad) sahip olması konusunda ısrarcıdır ve istemci kodu, üzerinde kodlanmış bir bağımlılıkla sona erer.

Sen edebilirsiniz çeşit dosya sistemi ve derleyici seçenekleri böylece kurcalıyor bu sorunu olsun com.example.Foofarklı bir dosyaya eşler, ancak bu şaşırtıcı ve unintuitive olduğunu. Bunu bile, kod edilir hala sınıfın tek uygulanmasına bağladılar. Yani, sınıfa Foobağlı bir sınıf MySetyazarsanız MySet, derleme zamanında bir uygulama seçebilirsiniz, ancak Fooiki farklı uygulama kullanarak bunları başlatamazsınız MySet.

Bu talihsiz tasarım kararı, insanları interfacedaha sonra farklı bir uygulamaya ihtiyaç duyma ihtimaline karşı veya kodlarını test etmek için gelecekteki kanıtlarını sağlamak için gereksiz yere kullanmaya zorlar . Bu her zaman mümkün değildir; Sınıfın iki örneğinin özel alanlarına bakan herhangi bir yönteminiz varsa, bunları bir arabirimde uygulayamazsınız. Bu yüzden, örneğin, unionJava'nın Setarayüzünde görmüyorsunuz . Yine de, sayısal türlerin ve koleksiyonların dışında, ikili yöntemler yaygın değildir, bu yüzden genellikle ondan kurtulabilirsiniz.

Tabii ki, eğer sizi ararsanız, new Foo(...)hala sınıfa bağımlısınızdır , bu yüzden bir sınıfın doğrudan bir arayüzü başlatabilmesini istiyorsanız bir fabrikaya ihtiyacınız vardır. Bununla birlikte, kurucudaki örneği kabul etmek ve hangi uygulamanın kullanılacağına başka birinin karar vermesine izin vermek genellikle daha iyi bir fikirdir.

Kod tabanınızı arabirimler ve fabrikalarla şişirmeye değip değmeyeceğine karar vermek size bağlıdır. Bir yandan, söz konusu sınıf kod tabanınızın içindeyse, kodu farklı bir sınıf veya arabirim kullanacak şekilde yeniden düzenlemek önemsizdir; Durum ortaya çıkarsa YAGNI ve refactor'ü daha sonra çağırabilirsin . Ancak, sınıf yayınladığınız bir kütüphanenin genel API'sinin bir parçasıysa, müşteri kodunu düzeltme seçeneğiniz yoktur. Eğer kullanmazsanız interfaceve daha sonra birden fazla uygulamaya ihtiyacınız varsa, bir kaya ile sert bir yer arasında sıkışıp kalacaksınız.


2
Java ve .NET gibi türevlerin kendi sınıflarını yaratan bir sınıf için özel bir sözdizimine sahip newolmalarını ve aksi takdirde özel olarak adlandırılmış bir statik yöntemi çağırmak için basitçe sözdizimsel bir şeker olmasını isterdim (eğer bir tür "kamu yapıcısı olsaydı otomatik olarak üretilirdi") "ancak açıkça yöntemi içermiyordu). IMHO, kod yalnızca uygulayan sıkıcı bir varsayılan şey istiyorsa List, müşterinin herhangi bir özel uygulamayı (örn. ArrayList) Bilmesi gerekmeden arayüzün bunu vermesi mümkün olmalıdır .
Supercat,

2

Benim düşünceme göre, sadece uygun bir tasarım deseni olmayan Basit Fabrikayı kullanıyorlar ve Soyut Fabrika veya Fabrika Yöntemi ile karıştırılmamalıdırlar.

Ve “binlerce CreateXXX statik yöntemiyle devasa bir kumaş sınıfı” yarattıklarından, bu bir anti-paterne (belki de bir Tanrı sınıfı olabilir) geliyor.

Simple Factory ve statik yaratıcı yöntemlerinin (harici bir sınıf gerektirmeyen) bazı durumlarda yararlı olabileceğini düşünüyorum. Örneğin, bir nesnenin inşası, diğer nesnelerin yerleştirilmesi gibi çeşitli adımlar gerektirdiğinde (örneğin kompozisyonu tercih etme).

Buna Fabrika demeyi bile söyleyemem, ancak rastgele bir sınıfta "Fabrika" ekiyle kapsanan birkaç yöntem.


1
Basit fabrika yerini aldı. Bir varlığın iki yapıcı parametresi aldığını int xve IFooService fooService. Her yerden dolaşmak istemiyorsunuz fooService, bu nedenle bir yöntemle bir fabrika oluşturup Create(int x)servisi fabrikaya enjekte ediyorsunuz .
AlexFoxGill

4
@AlexG Ve sonra, IFactorybunun yerine her yerden dolaşmanız gerekir IFooService.
Öforik

3
Öforik ile aynı fikirdeyim; Tecrübelerime göre, yukarıdan bir grafiğe enjekte edilen nesneler, tüm alt-seviye nesnelerin ihtiyaç duyduğu bir tür olma eğilimindedir ve bu yüzden IFooServices'ı etrafından geçirmek önemli değildir. Bir soyutlamayı bir başkasıyla değiştirmek, kod tabanını daha da gizlemekten başka bir şey yapmaz.
KeithS 14'14

bu, “Neden doğrudan nesne yapımı yerine fabrika sınıfı kullanmalıyım? Kamu yapıcılarını ne zaman kullanmalıyım ve ne zaman fabrikaları kullanmalıyım?” sorusuyla tamamen alakasız görünüyor. Bkz. Nasıl Cevap
Verilir

1
Bu sadece sorunun başlığı, sanırım geri kalanını kaçırdın. Sağlanan bağlantının son noktasına bakınız;).
FranMowinckel

1

Bir kütüphanenin kullanıcısı olarak, kütüphanenin fabrika yöntemleri varsa, bunları kullanmalısınız. Fabrika yönteminin kütüphane yazarına kodunuzu etkilemeden belirli değişiklikler yapma esnekliği sağladığını varsayıyorsunuz. Örneğin, basit bir kurucu ile çalışmayan bir fabrika yönteminde bazı alt sınıfların bir örneğini iade edebilirler.

Bir kütüphanenin yaratıcısı olarak, bu esnekliği kendiniz kullanmak istiyorsanız, fabrika yöntemlerini kullanırsınız.

Tarif ettiğiniz durumda, yapıcıları fabrika yöntemleriyle değiştirmenin sadece anlamsız olduğu izlenimini uyandırıyor gibi görünüyorsunuz. Bu, katılan herkes için kesinlikle bir acıydı; Bir kütüphane, API'sından hiçbir şeyi çok iyi bir sebep olmadan silmemelidir. Bu yüzden eğer fabrika metotları ekleseydim, bir fabrika metodu artık bu kurucuyu çağırmayacak ve mevcut düz kurucuyu kullanması gerektiğinden daha az işe yaramayacak şekilde kodlanıncaya kadar mevcut yapımcıları müsait bırakmayacaktım . İzleniminiz çok iyi olabilir.


Ayrıca not edin; Geliştiricinin ek işlevsellik (ek özellikler, başlatma) ile türetilmiş bir sınıf sağlaması gerekiyorsa, geliştirici bunu yapabilir. (fabrika yöntemlerinin geçersiz kılındığını varsayarsak). API yazarı ayrıca özel müşteri ihtiyaçları için bir çözüm sağlayabilir.
Eric Schneider

-4

Bu Scala ve fonksiyonel programlama çağında modası geçmiş gibi görünüyor. Sağlam bir fonksiyon temeli, bir gazillion sınıfının yerini almaktadır.

Ayrıca {{bir fabrika kullanırken Java'nın çiftinin artık çalışmadığını unutmayın.

someFunction(new someObject() {{
    setSomeParam(...);
    etc..
}})

Bu, anonim bir sınıf oluşturmanıza ve özelleştirmenize izin verebilir.

Zaman alanı ikileminde, zaman faktörü artık çok fazla küçülüyor, hızlı CPU'lar sayesinde, alanın küçülmesini sağlayan işlevsel programlama yani kod boyutu artık pratik.


2
bu daha telaşlı bir yorum gibi gözüküyor (bkz. Nasıl Cevap Verilir ) ve önceki 9
cevapta
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.