"JAVA ve Desenler" in Soyut Fabrika Modeli

Sahne sorunu

Bir bilgisayarın yaşam kurulumunda yaygın bir örneği ele alalım.Bir bilgisayarı bir araya getirdiğimizde, genellikle CPU, sabit disk, bellek, anakart, güç kaynağı, kasa vb. Gibi bir dizi aksesuar seçmemiz gerekir. Basitliğin kullanımını tartışmak için sadece CPU ve anakart seçimini düşünün.

Aslında bir CPU seçerken marka, model, pin sayısı ve ana frekans gibi bir dizi problemle karşı karşıya kalıyorsunuz, ancak bu problemler belirlendiğinde belirli CPU'yu belirleyebiliyorsunuz.

Benzer şekilde bir anakart seçerken marka, yonga seti, entegre yonga, veriyolu frekansı ve diğer sorunlar gibi bir dizi sorun da vardır, ancak bunlar belirlendiğinde belirli anakart belirlenebilir.

Farklı CPU'lar ve anakartlar seçmek, her bir müşterimizin bilgisayarı monte ederken kurulum şirketine koyduğu bir gerekliliktir, bu her birimiz tarafından hazırlanan kurulum planıdır.

Kurulum planını tamamlamadan önce çeşitli aksesuarların uyumluluğunu da bir bütün olarak değerlendirmek gerekir. Örneğin: CPU ve anakart, Intel CPU ve AMD anakart kullanıyorsanız, montajı imkansızdır. Intelin CPU pinleri AMD anakartları tarafından sağlanan CPU soketleriyle uyumlu olmadığından, yani Intelin CPUlarını kullanırsanız, bunları AMDnin anakartlarına takamazsınız, bu nedenle kurulum planı entegre edilmiştir. İlişkili.

Kurulum mühendisi söz konusu olduğunda, yalnızca bir bilgisayarı monte etmek için ilgili aksesuarların gerekli olduğunu bilir, ancak müşterinin hangi aksesuarları kullanacağına karar vermesi gerekir. Diğer bir deyişle, montaj mühendisi yalnızca montajdan sorumludur ve montaj için gereken belirli aksesuarları seçmekten müşteri sorumludur. Bu nedenle, kurulum mühendisi farklı müşteriler için bilgisayarları monte ettiğinde, yalnızca müşterinin kurulum planına göre ilgili aksesuarları edinmesi ve ardından montajı yapması gerekir.

Basit fabrika kalıbı kullanarak çözüm

Müşterinin işlevlerini göz önünde bulundurarak, ihtiyacınız olan CPU ve anakartı seçmeniz ve ardından kurulum mühendisine seçiminizi söylemeniz ve ardından kurulum mühendisinin bilgisayarı monte etmesini beklemeniz gerekir.

Kurulum mühendisi için, o sadece CPU ve anakart arasındaki arayüzü biliyor, ancak özel uygulamayı bilmiyor Açıkçası, basit fabrika modu veya fabrika yöntemi modu kullanılabilir. Basit olması için burada basit bir fabrika seçilmiştir. Müşteri, kurulum mühendisine seçimini söyler ve ardından kurulum mühendisi ilgili fabrika aracılığıyla ilgili örnek nesnesini elde eder.

Kaynak kodu

CPU arayüzü ve özel uygulama

genel arayüz Cpu { public void calculate (); } public class IntelCpu, Cpu { / ** * CPU'nun pin sayısı * / özel int pinleri = 0; public IntelCpu (int pinler) { this.pins = iğneler; } @Override public void hesapla () { // TODO Otomatik oluşturulan yöntem saplaması System.out.println ("Intel CPU'nun pin sayısı:" + pinler); } } public class AmdCpu, Cpu { / ** * CPU'nun pin sayısı * / özel int pinleri = 0; public AmdCpu (int pinler) { this.pins = iğneler; } @Override public void hesapla () { // TODO Otomatik oluşturulan yöntem saplaması System.out.println ("AMD CPU'nun pin sayısı:" + pinler); } }

Anakart arayüzü ve somut gerçekleştirme

genel arayüz Mainboard { public void installCPU (); } public class IntelMainboard, Mainboard'u uygular { / ** * CPU soketindeki delik sayısı * / özel int cpuHoles = 0; / ** * Yapım yöntemi, CPU soketine geçirilen delik sayısı * @param cpuHoles * / public IntelMainboard (int cpuHoles) { this.cpuHoles = cpuHoles; } @Override public void installCPU () { // TODO Otomatik oluşturulan yöntem saplaması System.out.println ("Intel ana kartındaki CPU soketlerinin sayısı:" + cpuHoles); } } public class AmdMainboard, Mainboard'u uygular { / ** * CPU soketindeki delik sayısı * / özel int cpuHoles = 0; / ** * Yapım yöntemi, CPU soketine geçirilen delik sayısı * @param cpuHoles * / public AmdMainboard (int cpuHoles) { this.cpuHoles = cpuHoles; } @Override public void installCPU () { // TODO Otomatik oluşturulan yöntem saplaması System.out.println ("AMD anakartlarındaki CPU soketlerinin sayısı:" + cpuHoles); } }

CPU ve anakart fabrikaları

public class CpuFactory { public static Cpu createCpu (int type) { Cpu cpu = boş; eğer (tür == 1) { cpu = yeni IntelCpu (755); } else if (type == 2) { cpu = yeni AmdCpu (938); } dönüş cpu; } } public class MainboardFactory { public static Mainboard createMainboard (int type) { Anakart anakart = boş; eğer (tür == 1) { anakart = yeni IntelMainboard (755); } else if (type == 2) { anakart = yeni AmdMainboard (938); } anakartı iade et; } }

Kurulum mühendisi sınıfının ve müşteri sınıfının çalışma sonuçları aşağıdaki gibidir:

public class ComputerEngineer { / ** * Montaj makinesinin ihtiyaç duyduğu CPU'yu tanımlayın * / özel Cpu cpu = boş; / ** * Montaj makinesinin ihtiyaç duyduğu anakartı tanımlayın * / özel Anakart anakartı = boş; public void makeComputer (int cpuType, int anakart) { / ** * Makinenin montajının temel adımları * / // 1: Önce kurulum için gerekli aksesuarları hazırlayın hazırlamakHardwares (cpuType, anakart); // 2: Makineyi birleştirin // 3: test makinesi // 4: Müşteriye teslimat } private void readyHardwares (int cpuType, int mainboard) { // CPU ve anakartın özel uygulamasını hazırlayacağım.Basitlik adına burada sadece bu ikisi hazırlanmıştır // Ancak kurulum mühendisi onu nasıl oluşturacağını bilmiyor, ne yapmalıyım? // İlgili fabrikayı doğrudan bulun this.cpu = CpuFactory.createCpu (cpuType); this.mainboard = MainboardFactory.createMainboard (ana kart); // Aksesuarların kullanımının kolay olup olmadığını test edin this.cpu.calculate (); this.mainboard.installCPU (); } } public class Client { public static void main (Stringargs) { ComputerEngineer cf = new ComputerEngineer (); cf.makeComputer (1,1); } }

Sonuçlar aşağıdaki gibidir:

Yukarıdaki uygulama basit bir fabrika yöntemiyle çözülmüştür: kurulum mühendisi için sadece CPU ile anakart arasındaki arayüz bilinmektedir, ancak spesifik uygulama sorunu bilinmemektedir. Ancak hala çözülmemiş bir sorun var, yani bu CPU nesneleri ve ana kart nesneleri aslında birbirleriyle ilişkili ve birbirleriyle eşleşmesi gerekiyor. Yukarıdaki uygulamada, bu ilişki sürdürülmez, CPU ve ana kart keyfi olarak müşteri tarafından seçilir ki bu sorunludur. Örneğin, istemcide makeComputer çağrılırken, gelen parametreler (1,2) 'dir ve çalışan sonuçlar aşağıdaki gibidir:

Yukarıdaki sonuçları gözlemlediğinizde sorunu göreceksiniz. Müşteri Intel'in CPU pin sayısını 755 olarak seçti ve seçilen anakart AMD oldu ve anakart üzerindeki CPU soketi 938 idi, bu da montajı imkansızdı.Bu, aksesuarlar arasındaki ilişkinin bakım eksikliğinden kaynaklanıyordu. Bu problem nasıl çözülür?

Soyut fabrika modelini tanıtın

Her mod, belirli bir soruna bir çözümdür. Soyut fabrika kalıbı ile fabrika yöntemi kalıbı arasındaki en büyük fark, fabrika yöntemi kalıbının tek bir ürün düzeyi yapısını hedeflemesidir; soyut fabrika kalıbının birden çok ürün düzeyi yapısıyla yüzleşmesi gerekir.

Soyut fabrikaların somut örneklerini öğrenmeden önce, iki önemli kavramı anlamalısınız: ürün ailesi ve ürün seviyesi.

Sözde ürün ailesi, farklı ürün hiyerarşik yapılarında bulunan ve işlevleri ilişkili olan bir ürün ailesini ifade eder. Örneğin, AMD'nin anakartı, yonga seti ve CPU'su bir aile oluşturur ve Intel'in anakartı, yonga seti ve CPU'su bir aileyi oluşturur. Her iki aile de üç ürün seviyesinden gelir: anakartlar, yonga setleri ve CPU'lar. Hiyerarşik bir yapı, aynı yapının ürünlerinden oluşur. Şematik diyagram aşağıdaki gibidir:

Açıktır ki, her bir ürün ailesinde yer alan ürün sayısı, ürün sınıfı yapıların sayısına eşittir. Ürünün hiyerarşik yapısı ve ürün ailesi, iki boyutlu bir koordinat sistemi oluşturmak için ürünü farklı yönlere böler. Yatay eksen ürün seviyesi yapısını, dikey eksen ise ürün ailesini temsil etmektedir.Yukarıdaki şekilde üç farklı ürün seviyesi yapısına dağılmış iki ürün ailesi vardır. Ürün ailesi ve bir ürünün ait olduğu hiyerarşik yapı belirtilebildiği sürece, ürün benzersiz bir şekilde belirlenebilir.

Yukarıda verilen üç farklı hiyerarşik yapı paralel yapılara sahiptir. Bu nedenle, fabrika yöntemi modeli benimsenirse, bu üç ürün hiyerarşisi yapısıyla başa çıkmak için üç bağımsız fabrika hiyerarşisi yapısının kullanılması gerekir. Üç ürün seviyesi yapısının benzerliğinden dolayı, üç paralel tesis seviyesi yapısı ortaya çıkacaktır. Ürün seviyesi yapılarının sayısı arttıkça fabrika metodu modelinin verdiği fabrika seviyesi yapılarının sayısı da artacaktır. Aşağıda gösterildiği gibi:

Öyleyse, aynı fabrika hiyerarşisi bu aynı veya çok benzer ürün hiyerarşi yapılarıyla başa çıkmak için kullanılabilir mi? Elbette olabilir ve bu soyut fabrika modelinin faydasıdır. Aynı fabrika hiyerarşisi, üç farklı ürün hiyerarşisi yapısında ürün nesnelerinin oluşturulmasından sorumludur.

Bir fabrika hiyerarşisinin, farklı ürün hiyerarşi yapılarına ait bir ürün ailesindeki tüm nesneleri oluşturabileceği görülebilmektedir. Açıktır ki, soyut fabrika modeli şu anda basit fabrika kalıbı ve fabrika yöntemi modelinden daha etkilidir. Her ürün ailesi için özel bir fabrika bulunmaktadır. Her belirli fabrika, aynı ürün ailesine ait ancak farklı hiyerarşik yapılara ait ürünler oluşturmaktan sorumludur.

Soyut fabrika desen yapısı

Soyut fabrika modeli, bir nesne oluşturma modelidir ve fabrika yöntemi modelinin daha ileri bir promosyonudur.

Bir alt sistemin bazı ürün nesnelerine ihtiyacı olduğunu ve bu ürünlerin birden fazla ürün düzeyi yapısına ait olduğunu varsayalım. Bu ürün nesnelerini tüketme sorumluluğunu, bu ürün nesnelerini yaratma sorumluluğundan ayırmak için soyut bir fabrika modeli getirilebilir. Bu durumda, ürünü tüketen tarafın, ürünün oluşturulmasına doğrudan katılması gerekmez, sadece gerekli ürünü ortak bir fabrika arayüzünden talep etmesi gerekir.

Soyut fabrika modelini kullanarak, aynı (veya benzer) hiyerarşik yapıya sahip birden çok ürün ailesinde ürün nesnelerinin oluşturulması ele alınabilir. Aşağıda gösterildiği gibi:

Bu iki ürün ailesi aynı hiyerarşik yapıya sahip olduğundan, aynı fabrika ailesi de bu iki ürün ailesinin oluşturulmasıyla başa çıkmak için kullanılabilir.Bu soyut fabrika modelidir.

Ürün rolünün yapı diyagramına göre fabrika rolünün yapı tasarım diyagramını vermek zor değildir.

Her fabrika rolünün, farklı ürün hiyerarşilerine ait ürün nesnelerini oluşturmaktan sorumlu iki fabrika yöntemine sahip olduğu görülebilir.

Kaynak kodu

Önceki örnekte uygulanan CPU arayüzü ve CPU uygulama nesneleri, ana kart arayüzü ve ana kart uygulama nesnelerinin değiştirilmesine gerek yoktur.

Önceki örnekte oluşturuldu İşlemci Basit fabrika ve yaratma Anakart Basit fabrikalara artık ihtiyaç yok.

Yeni eklenen soyut fabrika sınıfı ve uygulama sınıfı:

genel arayüz AbstractFactory { / ** * Bir CPU nesnesi oluşturun * @return CPU nesnesi * / genel Cpu createCpu (); / ** * Bir anakart nesnesi oluşturun * @return anakart nesnesi * / public Mainboard createMainboard (); } public class IntelFactory AbstractFactory'yi uygular { @Override public Cpu createCpu () { // TODO Otomatik oluşturulan yöntem saplaması yeni IntelCpu (755) döndür; } @Override public Mainboard createMainboard () { // TODO Otomatik oluşturulan yöntem saplaması yeni IntelMainboard (755) iade; } } public class AmdFactory AbstractFactory { @Override public Cpu createCpu () { // TODO Otomatik oluşturulan yöntem saplaması yeni IntelCpu (938) döndür; } @Override public Mainboard createMainboard () { // TODO Otomatik oluşturulan yöntem saplaması yeni IntelMainboard (938) döndür; } }

Önceki uygulama ile karşılaştırıldığında, kurulum mühendisi sınıfının ana değişikliği şudur: istemciden CPU ve anakart seçmek için parametreleri geçirmek yerine, doğrudan müşterinin seçtiği ürün nesnelerine geçer. Bu, CPU ve anakartın ayrı ayrı seçilmesinden kaynaklanan uyumluluk sorunlarını ortadan kaldırır ve müşterinin bir set, bir seri seçmesi gerekir.

public class ComputerEngineer { / ** * Montaj makinesinin ihtiyaç duyduğu CPU'yu tanımlayın * / özel Cpu cpu = boş; / ** * Montaj makinesinin ihtiyaç duyduğu anakartı tanımlayın * / özel Anakart anakartı = boş; public void makeComputer (AbstractFactory af) { / ** * Makinenin montajının temel adımları * / // 1: Önce kurulum için gerekli aksesuarları hazırlayın hazırlamakHardwares (af); // 2: Makineyi birleştirin // 3: test makinesi // 4: Müşteriye teslimat } private void readyHardwares (AbstractFactory af) { // CPU ve anakartın özel uygulamasını hazırlayacağım.Basitlik adına burada sadece bu ikisi hazırlanmıştır // Ancak kurulum mühendisi onu nasıl oluşturacağını bilmiyor, ne yapmalıyım? // İlgili fabrikayı doğrudan bulun this.cpu = af.createCpu (); this.mainboard = af.createMainboard (); // Aksesuarların kullanımının kolay olup olmadığını test edin this.cpu.calculate (); this.mainboard.installCPU (); } }

Müşteri kodu:

public class Client { public static void main (Stringargs) { // Kurulum mühendisi nesnesi oluştur ComputerEngineer cf = new ComputerEngineer (); // Müşteri, kullanılacak ürün nesnesini seçer ve oluşturur AbstractFactory af = new IntelFactory (); // Kurulum mühendisine ürünü seçmesini ve kurulum mühendisinin bilgisayarı monte etmesine izin vermesini söyleyin cf.makeComputer (af); } }

Soyut fabrikanın işlevi, bir dizi ilgili nesne veya birbirine bağlı nesne için bir arayüz oluşturmaktır. Bu arayüzdeki yöntemlerin keyfi olarak yığılmış olmayıp, bir dizi ilişkili veya birbirine bağlı yöntem olduğuna dikkat edilmelidir. Örneğin, yukarıdaki örnekte anakart ve CPU, bir bilgisayarı birleştirmek için tüm ilgili nesnelerdir. Farklı kurulum şemaları belirli bir bilgisayar serisini temsil eder.

Soyut bir fabrika tarafından tanımlanan bir dizi nesne genellikle birbiriyle ilişkili veya birbirine bağlı olduğundan, bu ürün nesneleri bir ürün ailesini oluşturur, yani soyut fabrika bir ürün ailesini tanımlar.

Bu büyük bir esneklik getiriyor Ürün ailelerini değiştirirken, yalnızca farklı soyut fabrika uygulamaları sağlamanız gerekiyor, bu da ürün ailesinin artık bir bütün olarak değiştirildiği anlamına geliyor.

Soyut fabrika modeli hangi koşullarda kullanılmalıdır?

1. Bir sistem, tüm fabrika modelleri için önemli olan, ürün sınıfı örneklerinin nasıl yaratıldığına, birleştirildiğine ve ifade edildiğine ilişkin ayrıntılara bağlı olmamalıdır.

2. Bu sistemin ürünleri birden fazla ürün ailesine sahip olup, sistem bunlardan sadece birinin ürünlerini tüketmektedir.

3. Aynı ürün ailesine ait ürünler birlikte kullanılır ve bu kısıtlamanın sistem tasarımına yansıtılması gerekir. (Örneğin: Intel anakart Intel CPU, Intel chipset kullanmalıdır)

4. Sistem bir ürün sınıfı kitaplığı sağlar, tüm ürünler aynı arayüzle görünür, böylece istemci uygulamaya bağlı olmaz.

Soyut fabrika modelinin kökeni

Soyut fabrika modelinin kökeni veya ilk uygulaması, farklı işletim sistemlerine ait pencereler oluşturmaktır. Örneğin, komut düğmesi (Düğme) ve metin kutusu (Metin) pencerelerde yerleşiktir.UNIX işletim sisteminin pencere ortamında ve Windows işletim sisteminin pencere ortamında bu iki yapının farklı yerel uygulamaları vardır ve bunların ayrıntıları farklıdır. .

Her işletim sisteminde, bir Windows yapı ailesi vardır. İşte Button ve Text'den oluşan ürün ailesi. Her pencere bileşeni, soyut bir işlev tanımı veren soyut bir rol ve farklı işletim sistemleri altında somut gerçekleştirmeler veren somut alt sınıflarla kendi hiyerarşik yapısını oluşturur.

Yukarıdaki ürün sınıfı şemasında, Düğme hiyerarşik yapısı ve Metin hiyerarşik yapısı olmak üzere iki ürün hiyerarşik yapısı olduğu görülebilir. Aynı anda iki ürün ailesi vardır, bunlar UNIX ürün ailesi ve Windows ürün ailesi. UNIX ürün ailesi, UNIX Button ve UNIX Text ürünlerinden oluşur ve Windows ürün ailesi, Windows Button ve Windows Text ürünlerinden oluşur.

Ürün nesnelerinin oluşturulması için sistemin gereksinimleri, UnixFactory ve WindowsFactory olmak üzere iki özel proje rolünün bulunduğu bir projenin hiyerarşik yapısı tarafından karşılanır. UnixFactory nesnesi, Unix ürün ailesinde ürünler oluşturmaktan sorumludur ve WindowsFactory nesnesi Windows ürün ailesinde ürünler oluşturmaktan sorumludur. Bu, soyut fabrika modelinin uygulamasıdır.Soyut fabrika modelinin çözümü aşağıdaki gibidir:

Açıktır ki, bir sistem yalnızca belirli bir işletim sisteminin Windows ortamında çalışabilir ve aynı anda farklı işletim sistemlerinde çalışamaz. Dolayısıyla sistem aslında sadece aynı ürün ailesine ait ürünleri tüketebilmektedir.

Modern uygulamalarda, soyut fabrika modelinin kullanım kapsamı büyük ölçüde genişletilmiştir ve sistemin artık yalnızca belirli bir ürün ailesini tüketmesi gerekmemektedir. Bu nedenle, daha önce bahsedilen asıl amacı göz ardı edebilirsiniz.

Soyut fabrika modelinin avantajları

  • Ayrı arayüz ve uygulama

İstemci, gerekli nesneleri oluşturmak için soyut bir fabrika kullanır ve müşteri belirli uygulamanın kim olduğunu bilmez Müşteri sadece ürün odaklı arayüz programlamasıdır. Başka bir deyişle, müşteri belirli ürün uygulamasından ayrıştırılır.

  • Ürün aileleri arasında geçiş yapmayı kolaylaştırın

Belirli bir fabrika uygulaması bir ürün ailesini temsil ettiğinden, örneğin yukarıdaki örnekte, yalnızca belirli fabrikayı Intel serisinden AMD serisine geçirmeniz gerekir.

Soyut fabrika modelinin dezavantajları

  • Yeni ürünleri genişletmek kolay değil

Tüm ürün ailesine yeni bir ürün eklemeniz gerekirse, soyut fabrikayı değiştirmeniz gerekir, bu da tüm fabrika uygulama sınıflarının değiştirilmesine neden olur.

Dikkatli hesaplamalar GAC Trumpchi GS41.5T yakıt tüketimi testi
önceki
Zhejiang Tiantai, 2018 yılında tarım makineleri bakım hizmeti yetenekleriyle ilgili bir anket başlattı
Sonraki
Merhaba yoldaşlar, NIKE sizi desteklemek için "BETRUE" serisini başlattı!
33 yaşındaki Hua Jie şampiyonu, ikinci evlilik yıldönümünü kutlamak için sevgisini göstermek için kocasını "çaldı"
Tianjin Jinghai, tarım makineleri tamircileri için profesyonel beceri değerlendirmesini başlattı
Sınırlı stok almadınız mı? Li Ning New York Moda Haftası kelebek ayakkabıları, başlamak için daha fazla kanalı kaçırmayın!
Redis'e Dayalı Akım Sınırlama Sisteminin Tasarımı
Eski TVB, Xiaohua'nın 36. doğum gününü kutluyor ve kocası sosyal ağlarda güzel fotoğraflar yayınlıyor ve kutsamalar gösteriyor.
Büyük ölçekli ekim yapmak, para kazanmak kolay değildir ve çok çalışın!
Bekarların yaklaşık 150.000 popüler model arasından seçim yapması önerilir
Liu Qiangdong strateji üzerine bir makale yazıyor: Jingdong entegrasyondan entegrasyon açılımına geçmeli
Xiaobai, Yosuke Kubotuka ile yakın bir fotoğraf paylaşıyor! Genel kondisyon indeksiniz nedir?
Yarım yıldan fazla bir süredir çıkıyorlar! 31 yaşındaki TVB Xiaohua, ilişkisinden atıldıktan sonra nihayet aşkını itiraf etti
Dünyanın en pahalı tarım ürünü: bir yıllık maaş sadece bir tavuk için yeterli!
To Top