Saya terpaksa menulis artikel ini karena dua alasan. Baru-baru ini, saya bertemu dengan pola Pabrik Abstrak. Seperti kata pepatah - "Tidak tahu bagaimana melakukannya sendiri, ajari teman." Diketahui bahwa salah satu cara terbaik untuk mengkonsolidasikan materi adalah dengan menjelaskan kepada seseorang yang telah dipelajari sebelumnya. Alasan kedua - dalam proses mempelajari pola ini, saya tidak menemukan materi yang bagi saya secara pribadi akan dengan jelas menyatakan esensi dari Pabrik Abstrak (setidaknya pada HabrΓ©).
Jadi mari kita mulai. Pertanyaan pertama yang perlu Anda jawab sendiri dengan mempelajari pola ini: "Apa itu pabrik Abstrak." Jawaban paling sederhana dan paling akurat adalah bahwa Pabrik Abstrak adalah "pabrik pabrik." Tetapi di sini muncul pertanyaan kedua: "Mengapa ada orang yang membutuhkan" pabrik pabrik "? Untuk menjawabnya, perhatikan contoh dari kehidupan nyata.
Misalkan Anda memutuskan untuk mengambil kendali penuh dari pasar mobil. Bagaimana cara melakukannya? Anda dapat membuat merek mobil Anda sendiri, produksi Anda, melakukan perusahaan periklanan skala besar, dll. Tapi, dalam hal ini, Anda harus bertarung dengan raksasa pasar mobil seperti Toyota atau Ford. Bukan fakta bahwa Anda akan muncul sebagai pemenang dari perjuangan ini. Solusi yang jauh lebih baik adalah membeli pabrik-pabrik dari semua perusahaan ini, terus memproduksi mobil dengan merek mereka sendiri, dan memasukkan keuntungan ke dalam kantong Anda. Jika saya tidak salah, struktur ekonomi seperti itu disebut holding. Holding ini akan menjadi Pabrik Abstrak atau "Pabrik Pabrik". Dalam program kami, pabrik Abstrak (holding) akan diwakili oleh antarmuka atau kelas abstrak. Perusahaan-perusahaan yang termasuk dalam holding diwakili oleh kelas-kelas yang mengimplementasikan antarmuka ini.
public interface CarsFactory { } public class ToyotaFactory implements CarsFactory {} public class FordFactory implements CarsFactory {}
Selanjutnya, Anda mengumpulkan para manajer dari pabrik Anda dan berkata: "Mulai sekarang, kami akan membuat mobil dengan 2 jenis tubuh di pabrik kami - sedan dan sebuah coupe. Misalnya, Jepang akan melakukan ToyotaSedan dan ToyotaCoupe, orang Amerika akan melakukan FordSedan dan FordCoupe. " Dan agar pabrik tidak lupa apa yang sebenarnya perlu dilakukan, dan jangan mulai, misalnya, SUV, kita akan menggantung gambar umum sedan dan coupe di kantor holding kami di tempat yang menonjol (di pabrik tertentu, para insinyur akan mencari cara membuat mobil yang mereka butuhkan). Jadi, 2 metode muncul di antarmuka CarsFactory kami:
public interface CarsFactory { Sedan createSedan(); Coupe createCoupe(); }
Karenanya, di kelas anak-anak dari antarmuka CarsFactory, metode ini juga harus diimplementasikan.
public class ToyotaFactory implements CarsFactory { @Override public Sedan createSedan() { return new ToyotaSedan(); } @Override public Coupe createCoupe() { return new ToyotaCoupe(); } } public class FordFactory implements CarsFactory { @Override public Sedan createSedan() { return new FordSedan(); } @Override public Coupe createCoupe() { return new FordCoupe(); } }
Perhatikan bahwa jenis nilai kembali dalam metode akan persis jenis umum untuk nilai kembali - sedan dan coupe. Kembali ke analogi kami - Anda memberi tahu pabrik membuat sedan - Anda mendapat sedan. Fitur, seperti sedan Ford, tidak menarik bagi Anda.
Seperti yang Anda dapat dengan mudah menebak dari kode di atas, beberapa entitas akan muncul di program kami yang menggambarkan tipe tubuh spesifik - sedan dan coupe. Entitas-entitas ini akan berupa antarmuka.
public interface Sedan {} public interface Coupe {}
Dan tentu saja, gambar-gambar ini harus memiliki perwujudan spesifik dalam bentuk mobil yang dibuat di pabrik tertentu.
public class ToyotaCoupe implements Coupe { public ToyotaCoupe() { System.out.println("Create ToyotaCoupe"); } } public class ToyotaSedan implements Sedan { public ToyotaSedan() { System.out.println("Create ToyotaSedan"); } } public class FordCoupe implements Coupe { public FordCoupe () { System.out.println("Create FordCoupe"); } } public class FordSedan implements Sedan { public FordSedan() { System.out.println("Create FordSedan"); } }
Itu saja, "pabrik pabrik" kami yang mampu memproduksi mobil dari merek apa pun dan jenis apa pun sudah siap. Di masa depan, Anda dapat memutuskan bahwa akan menyenangkan untuk mulai memproduksi SUV. Anda perlu membuat antarmuka lain, dan menggantung gambar SUV di kantor holding (tambahkan metode yang diperlukan untuk CarsFactory dan mengimplementasikannya di pabrik-pabrik anak perusahaan). Mungkin juga Anda memutuskan untuk mengambil bagian lain dari pasar dan membeli, misalnya, semua pabrik Nissan. Ini berarti Anda perlu membuat kelas lain yang mengimplementasikan CarsFactory - NissanFactory, dan mulai memproduksi mobil Anda dengan merek ini (NissanCoupe, NissanSedan, dll.)
Tetapi bagaimana pengguna tertentu (pembeli mobil) berinteraksi dengan holding kami? Pembeli umumnya tidak tahu bahwa Anda telah menyita semua pabrik mobil di dunia. Dia datang ke kantor kecil holding yang sederhana dan berkata, "Aku butuh mobil!" "Hebat!" - kami memberitahunya, - βAnda telah mengalamatkan alamat itu! Pabrik pabrik adalah yang Anda butuhkan! β
CarsFactory factory;
"Perusahaan mobil mana yang Anda sukai saat ini?", Kami bertanya. Misalkan pelanggan ingin membeli Toyota. Tidak masalah!
factory = new ToyotaFactory();
"Jenis tubuh apa yang kamu inginkan?" Katakanlah sedan. "Pilihan bagus!"
factory.createSedan();
Mobil sudah siap, Anda bisa pergi!