Catatan: Pertanyaan ada di akhir pos.
Saya telah membaca utas stackoverflow lainnya mengenai Abstract Factory vs Factory Method . Saya mengerti maksud dari masing-masing pola. Namun, saya tidak jelas tentang definisi itu.
Metode Pabrik mendefinisikan antarmuka untuk membuat objek, tetapi memungkinkan subclass memutuskan yang mana dari mereka untuk instantiate. Metode pabrik memungkinkan kelas menunda instantiation ke subclass.
Sebaliknya, Pabrik Abstrak menyediakan antarmuka untuk membuat keluarga objek terkait atau bergantung tanpa menentukan kelas konkret mereka.
The Abstrak Pabrik terlihat sangat mirip dengan Pabrik Metode . Saya telah menggambar beberapa kelas UML untuk mengilustrasikan poin saya.
catatan:
- Diagram berasal dari www.yuml.com sehingga tidak berorientasi sempurna. Tapi ini layanan gratis :).
- Diagram mungkin tidak sempurna. Saya masih mempelajari pola desain GoF .
Metode pabrik:
Pabrik Abstrak (hanya 1 anggota):
Pabrik Abstrak (lebih banyak anggota):
Pertanyaan:
- Jika Pabrik Abstrak hanya memiliki satu pencipta dan satu produk, apakah itu masih merupakan pola Pabrik Abstrak ? (antarmuka untuk membuat famili)
- Dapatkah pembuat Metode Pabrik dibuat dari Antarmuka atau harus dari kelas? (kelas menunda instantiations ke subclass)
- Jika Pabrik Abstrak hanya dapat memiliki satu pencipta dan satu produk, apakah satu-satunya perbedaan antara Pabrik Abstrak dan Metode Pabrik bahwa pencipta untuk yang pertama adalah sebuah Antarmuka dan pembuat untuk yang terakhir adalah Kelas?
Jawaban:
Semoga ini membantu. Ini menggambarkan berbagai jenis pabrik. Saya menggunakan Head First Design Patterns sebagai referensi saya. Saya menggunakan yuml.me untuk diagram.
Pabrik Statis
Merupakan kelas dengan Metode Statis untuk menghasilkan berbagai sub jenis Produk.
Pabrik Sederhana
Merupakan kelas yang dapat menghasilkan berbagai sub jenis Produk. (Lebih baik daripada Pabrik Statis. Ketika tipe baru ditambahkan, kelas Produk dasar tidak perlu diubah hanya Kelas Pabrik Sederhana)
Metode Pabrik
Berisi satu metode untuk menghasilkan satu jenis produk yang terkait dengan jenisnya. (Ini lebih baik daripada Pabrik Sederhana karena jenisnya ditangguhkan ke sub-kelas.)
Pabrik Abstrak
Menghasilkan Keluarga Jenis yang terkait. Ini sangat berbeda dari Metode Pabrik karena memiliki lebih dari satu metode jenis yang dihasilkannya. (Ini rumit merujuk ke diagram berikutnya untuk contoh kehidupan nyata yang lebih baik).
Contoh Dari .NET Framework
DbFactoriesProvider adalah Pabrik Sederhana karena tidak memiliki sub-tipe. DbFactoryProvider adalah pabrik abstrak karena dapat membuat berbagai objek database terkait seperti objek koneksi dan perintah.
sumber
Product
(sebagai abstrak), dan kemudianProduct1
danProduct2
, sebagai anak laki-laki? Itu akan membantu poin bahwa Metode Pabrik hanya tentang menciptakan satu produk, sedangkan Pabrik Abstrak kurang lebih sekelompok Metode Pabrik berkumpul bersama dalam keluarga.Kedua pola ini tentu terkait!
Perbedaan antara pola-pola ini umumnya ada dalam niat.
The maksud dari Pabrik Metode adalah "Tentukan sebuah antarmuka untuk menciptakan sebuah objek, tetapi biarkan subclass memutuskan mana kelas untuk instantiate. Factory Method memungkinkan Instansiasi kelas defer untuk subclass."
The maksud dari Pabrik Abstrak adalah "Menyediakan sebuah antarmuka untuk menciptakan keluarga dari obyek terkait atau tergantung tanpa menentukan kelas beton mereka."
Berdasarkan murni pada pernyataan niat ini (dikutip dari GoF), saya akan mengatakan bahwa memang Metode Pabrik dalam beberapa hal merupakan Pabrik Abstrak yang "merosot" dengan satu keluarga.
Mereka umumnya cenderung berbeda dalam implementasi, karena Metode Pabrik jauh lebih sederhana daripada Pabrik Abstrak .
Namun mereka terkait juga dalam implementasi. Sebagaimana dicatat dalam buku GoF,
Wiki c2 ini juga memiliki beberapa diskusi menarik tentang topik ini.
sumber
Tampaknya daftar pertanyaan (luar biasa) OP telah diabaikan. Jawaban saat ini hanya menawarkan definisi yang diulang. Jadi saya akan berusaha menjawab pertanyaan asli dengan singkat.
Tidak ada . Pabrik Abstrak harus membuat lebih dari satu produk untuk membuat "keluarga produk terkait". Contoh GoF kanonik membuat
ScrollBar()
danWindow()
. Keuntungan (dan tujuan) adalah bahwa Pabrik Abstrak dapat menegakkan tema umum di berbagai produknya.Pertama, kita harus perhatikan bahwa baik Java maupun C # tidak ada ketika GoF menulis buku mereka. Penggunaan istilah antarmuka oleh GoF tidak terkait dengan jenis antarmuka yang diperkenalkan oleh bahasa tertentu. Oleh karena itu, pembuat beton dapat dibuat dari API apa pun. Poin penting dalam pola adalah bahwa API mengkonsumsi Metode Pabrik sendiri, sehingga antarmuka dengan hanya satu metode tidak dapat menjadi Metode Pabrik seperti halnya Pabrik Abstrak.
Pertanyaan ini tidak lagi valid, mengikuti jawaban di atas; namun, jika Anda berpikir bahwa satu-satunya perbedaan antara Pabrik Abstrak dan Metode Pabrik adalah jumlah produk yang dibuat, pertimbangkan bagaimana klien mengkonsumsi masing-masing pola ini. Pabrik Abstrak biasanya disuntikkan ke kliennya dan dipanggil melalui komposisi / delegasi. Metode Pabrik harus diwariskan. Jadi semuanya kembali ke perdebatan komposisi vs warisan lama.
Tetapi jawaban ini telah menimbulkan pertanyaan keempat!
Jika metode ini statis, biasanya disebut Pabrik Statis . Jika metode ini tidak statis, biasanya disebut Pabrik Sederhana . Tak satu pun dari ini adalah pola GoF, tetapi dalam praktiknya mereka jauh lebih umum digunakan!
sumber
Menurut pendapat saya, sedikit perbedaan antara kedua pola terletak pada penerapannya , dan demikian, sebagaimana telah dikatakan, dalam Intent .
Mari rekap definisi (keduanya dari Wikipedia).
Pabrik Abstrak
Metode Pabrik
Kedua pola memungkinkan untuk memisahkan objek pengguna dari membuat instance yang diperlukan (run-time decoupling), dan ini adalah aspek umum. Kedua pola memungkinkan untuk membuat hierarki pabrik sesuai dengan kebutuhan spesifik, dan ini adalah aspek umum lainnya.
Abstrak Factory memungkinkan untuk membuat beberapa jenis instance yang berbeda dalam satu sub-kelas, dan untuk partikularisasi perilaku kreasi dalam sub-kelas yang berbeda; biasanya, metode Pabrik menyatakan penciptaan hanya satu jenis objek yang dapat dikelompokkan menurut mekanisme sub-klasifikasi. Itulah bedanya.
Dengan meringkas. Katakanlah Produk mendefinisikan kelas-super dari objek-objek pembuat, dan ProductA dan ProductB adalah dua sub-kelas yang berbeda. Oleh karena itu, metode Pabrik Abstrak akan memiliki dua metode, createProductA () dan createProductB () yang akan partikularisasi (dalam hal langkah-langkah pembuatan) dalam sub-kelas spesifiknya: sub-kelas pabrik memfokuskan langkah - langkah pembuatan untuk dua kelas yang ditentukan benda yang sedang dibuat.
Menurut contoh di atas, Metode Pabrik akan diimplementasikan secara berbeda, mengabstraksi pembuatan ProductA dan ProductB di banyak pabrik (satu metode per Pabrik), dan spesialisasi lebih lanjut dari langkah - langkah pembuatan akan didelegasikan ke hierarki saat dibangun. .
sumber
Jika saya membuat abstrak (direferensikan melalui antarmuka atau kelas dasar abstrak) kelas pabrik yang membuat objek yang hanya memiliki satu metode untuk membuat objek, maka itu akan menjadi metode pabrik .
Jika Pabrik yang diabstraksi memiliki lebih dari 1 metode untuk membuat objek, maka itu akan menjadi Pabrik yang Abstrak .
Katakanlah saya membuat Manajer yang akan menangani kebutuhan metode tindakan untuk pengontrol MVC. Jika memiliki satu metode, katakanlah untuk membuat objek mesin yang akan digunakan untuk membuat model tampilan, maka itu akan menjadi pola metode pabrik. Di sisi lain jika memiliki dua metode: satu untuk membuat mesin model tampilan, dan yang lain untuk membuat mesin model tindakan (atau apa pun yang Anda ingin sebut model yang metode tindakannya berisi konsumen), maka itu akan menjadi pabrik abstrak.
sumber
Meskipun, sudah bertahun-tahun sejak orang-orang dari StackOverflow mempertanyakan masalah ini dengan cara yang sama di pos-pos lain (terlama hingga 2009), saya masih tidak dapat menemukan jawaban yang saya inginkan.
Jadi saya melakukan beberapa jam meneliti melalui web, meninjau contoh-contoh, dan sampai pada kesimpulan ini, perbedaan utama Pabrik Abstrak dari Metode Pabrik adalah
Contohnya adalah counter
Oleh karena itu, ketika grup objek akhir harus memiliki gaya yang sama tanpa terkecuali objek dan Anda ingin menyembunyikan detail "menjaga gaya yang sama", maka kita harus menggunakan Pabrik Abstrak.
sumber
Sejauh yang saya mengerti arti o Abstrak pabrik dan definisi metode Pabrik yang pertama diimplementasikan dalam konteks statis dan menyediakan objek berdasarkan parameter input.
Yang kedua menggunakan objek yang sudah dibuat (keluarga) yang mengimplementasikan antarmuka metode pabrik. Metode pabrik kemudian membuat contoh spesifik terkait dengan objek asli tidak peduli yang mana itu.
Jadi ini biasanya mengarah ke menggunakan kedua pola bersama di mana pada langkah pertama Anda membuat beberapa objek umum yang menggambarkan keluarga objek terkait. Ini disebut dengan metode static getInstance ("my family name") metode. Implementasi metode getInstance memutuskan objek keluarga mana yang akan dibuat.
Kemudian saya memanggil metode createProduct () pada objek keluarga yang baru dibuat dan bergantung pada objek keluarga, produk baru akan dikembalikan.
Tampaknya pola-pola ini bekerja sama dengan masing-masing.
Dengan kata lain Abstrak Pabrik difokuskan pada "APA" yang akan dibuat dan metode Pabrik "BAGAIMANA" itu akan dibuat.
sumber
Yang harus Anda ingat adalah bahwa pabrik abstrak adalah pabrik yang dapat mengembalikan beberapa pabrik . Jadi, jika Anda memiliki AnimalSpeciesFactory, ia dapat mengembalikan pabrik seperti ini:
Mamalfactory, BirdFactory, Fishfactory, ReptileFactory. Sekarang Anda memiliki satu pabrik dari AnimalSpeciesFactory, mereka menggunakan pola pabrik untuk membuat objek tertentu. Misalnya, bayangkan Anda mendapat ReptileFactory dari AnimalFactory ini, maka Anda bisa menawarkan untuk membuat objek reptil seperti: Ular, kura-kura, objek kadal.
sumber
sumber
Pola metode pabrik adalah pola desain kreasi yang berhubungan dengan membuat objek tanpa menunjukkan kelas objek yang dibuat. Pola desain ini pada dasarnya memungkinkan kelas untuk menentang instantiation ke sub-kelas.
Pola Abstrak Pabrik melayani enkapsulasi ke sekelompok pabrik individu tanpa mengekspos kelas beton. Dalam model ini, antarmuka generik dari kelas pabrik abstrak digunakan untuk membuat objek konkret yang diperlukan yang memisahkan detail implementasi objek dari penggunaan dan komposisinya. Pola desain ini banyak digunakan dalam aplikasi GUI di mana komponen GUI yang serupa perlu dibuat.
saat mencari di google saya datang mengikuti blog yang menjelaskan kedua pola desain cemerlang. lihat ini
http://simpletechtalks.com/factory-design-pattern/
http://simpletechtalks.com/abstract-factory-design-pattern/
sumber