Kapan ide yang baik untuk menggunakan metode pabrik dalam objek, bukan kelas Pabrik?
design-patterns
factory
factory-pattern
factory-method
Ravindra babu
sumber
sumber
Jawaban:
Saya suka berpikir tentang pola desain dalam hal kelas saya menjadi 'orang,' dan polanya adalah cara orang berbicara satu sama lain.
Jadi, bagi saya pola pabrik seperti agen perekrutan. Anda memiliki seseorang yang membutuhkan sejumlah pekerja variabel. Orang ini mungkin mengetahui beberapa informasi yang mereka butuhkan pada orang yang mereka sewa, tetapi hanya itu.
Jadi, ketika mereka membutuhkan karyawan baru, mereka memanggil agen perekrutan dan memberi tahu mereka apa yang mereka butuhkan. Sekarang, untuk benar-benar merekrut seseorang, Anda perlu mengetahui banyak hal - manfaat, verifikasi kelayakan, dll. Tetapi orang yang direkrut tidak perlu mengetahui semua ini - agen perekrutan menangani semua itu.
Dengan cara yang sama, menggunakan Pabrik memungkinkan konsumen untuk membuat objek baru tanpa harus mengetahui detail bagaimana mereka dibuat, atau apa dependensi mereka - mereka hanya harus memberikan informasi yang mereka inginkan.
Jadi, sekarang konsumen ThingFactory bisa mendapatkan Thing, tanpa harus tahu tentang ketergantungan Thing, kecuali untuk data string yang berasal dari konsumen.
sumber
within an object instead of a Factory class
. Saya pikir dia maksudkan skenario di mana Anda membuat ctor pribadi dan menggunakan metode statis untuk membuat instance kelas (membuat objek). Tetapi untuk mengikuti contoh ini kita harus instantiateThingFactory
kelas terlebih dahulu untuk mendapatkanThing
objek, yang membuat iniFactory class
berlaku.Metode pabrik harus dianggap sebagai alternatif untuk konstruktor - kebanyakan ketika konstruktor tidak cukup ekspresif, yaitu.
tidak se ekspresif seperti:
Kelas pabrik berguna ketika Anda membutuhkan proses rumit untuk membangun objek, ketika konstruksi membutuhkan ketergantungan yang tidak Anda inginkan untuk kelas aktual, ketika Anda perlu membuat objek yang berbeda dll.
sumber
Satu situasi di mana saya secara pribadi menemukan kelas Pabrik terpisah masuk akal adalah ketika objek terakhir yang Anda coba buat bergantung pada beberapa objek lainnya. Misalnya, di PHP: Misalkan Anda memiliki
House
objek, yang pada gilirannya memilikiKitchen
danLivingRoom
objek, danLivingRoom
objek memilikiTV
dalam objek juga.Metode paling sederhana untuk mencapai hal ini adalah membuat setiap objek membuat anak-anak mereka pada metode konstruk mereka, tetapi jika properti relatif bersarang, ketika
House
gagal Anda membuat Anda mungkin akan menghabiskan waktu mencoba mengisolasi apa yang gagal.Alternatifnya adalah dengan melakukan hal berikut (injeksi ketergantungan, jika Anda suka istilah mewah):
Di sini jika proses membuat
House
gagal hanya ada satu tempat untuk dilihat, tetapi harus menggunakan potongan ini setiap kali seseorang ingin yang baruHouse
jauh dari nyaman. Masukkan Pabrik:Berkat pabrik di sini proses pembuatan
House
diabstraksikan (di mana Anda tidak perlu membuat dan mengatur setiap ketergantungan ketika Anda hanya ingin membuat aHouse
) dan pada saat yang sama terpusat yang membuatnya lebih mudah untuk dipertahankan. Ada alasan lain mengapa menggunakan Pabrik yang terpisah dapat bermanfaat (mis. Kemampuan testabilitas) tetapi saya menemukan kasus penggunaan khusus ini untuk mengilustrasikan terbaik bagaimana kelas Pabrik dapat bermanfaat.sumber
HouseFactory
kelas?create
metode. Misalnya, jika AndaHouse
akan selalu memiliki jenis yang samaLivingRoom
maka mungkin masuk akal untuk memiliki params hardcode di kelas pabrik daripada disahkan sebagai argumen. Atau Anda mungkin ingin memberikantype
argumen untukHouseFactory::create
metode Anda jika Anda memiliki beberapa jenisLivingRoom
s dan beralih di dalamnya dengan parameter yang di-hardcode untuk setiap jenis.Penting untuk membedakan ide di balik penggunaan pabrik atau metode pabrik. Keduanya dimaksudkan untuk mengatasi berbagai jenis masalah penciptaan objek yang saling eksklusif.
Mari kita lebih spesifik tentang "metode pabrik":
Hal pertama adalah bahwa, ketika Anda sedang mengembangkan perpustakaan atau API yang pada gilirannya akan digunakan untuk pengembangan aplikasi lebih lanjut, maka metode pabrik adalah salah satu pilihan terbaik untuk pola pembuatan. Alasan di balik; Kita tahu bahwa kapan membuat objek dengan fungsionalitas yang diperlukan, tetapi tipe objek akan tetap ragu-ragu atau akan ditentukan berdasarkan parameter dinamis yang dilewati .
Sekarang intinya adalah, kira-kira sama dapat dicapai dengan menggunakan pola pabrik itu sendiri tetapi satu kelemahan besar akan memperkenalkan ke dalam sistem jika pola pabrik akan digunakan untuk masalah yang disorot di atas, itu adalah bahwa logika Anda crating objek yang berbeda (objek kelas sub) akan spesifik untuk beberapa kondisi bisnis sehingga di masa mendatang ketika Anda perlu memperluas fungsionalitas perpustakaan Anda untuk platform lain (Secara lebih teknis, Anda perlu menambahkan lebih banyak sub kelas antarmuka dasar atau kelas abstrak sehingga pabrik akan mengembalikan benda-benda itu juga di samping yang sudah ada berdasarkan beberapa parameter dinamis) maka setiap kali Anda perlu mengubah (memperluas) logika kelas pabrik yang akan menjadi operasi yang mahal dan tidak baik dari perspektif desain. Di sisi lain, jika "metode pabrik"
sumber
Mereka juga berguna ketika Anda membutuhkan beberapa "konstruktor" dengan tipe parameter yang sama tetapi dengan perilaku yang berbeda.
sumber
Sebaiknya gunakan metode pabrik di dalam objek saat:
Sebaiknya gunakan kelas pabrik abstrak saat:
sumber
UML dari
Produk: Ini mendefinisikan antarmuka objek yang dibuat oleh metode Factory.
ConcreteProduct: Menerapkan antarmuka Produk
Pembuat: Menyatakan metode Pabrik
ConcreateCreator: Menerapkan metode Factory untuk mengembalikan instance dari ConcreteProduct
Pernyataan masalah: Buat Pabrik Game dengan menggunakan Metode Pabrik, yang mendefinisikan antarmuka game.
Cuplikan kode:
keluaran:
Contoh ini menunjukkan
Factory
kelas dengan mengimplementasikan aFactoryMethod
.Game
adalah antarmuka untuk semua jenis game. Ini mendefinisikan metode yang kompleks:createGame()
Chess, Ludo, Checkers
adalah varian permainan yang berbeda, yang menyediakan implementasi untukcreateGame()
public Game getGame(String gameName)
adaFactoryMethod
diIGameFactory
kelasGameFactory
pra-membuat berbagai jenis game di konstruktor. Ini menerapkanIGameFactory
metode pabrik.Nama game dilewatkan sebagai argumen baris perintah ke
NotStaticFactoryDemo
getGame
diGameFactory
menerima nama permainan dan mengembalikanGame
objek yang sesuai .Pabrik:
FactoryMethod
Gunakan kasus:
Kapan harus menggunakan:
Client
tidak tahu kelas konkret apa yang harus dibuat saat runtime, tetapi hanya ingin mendapatkan kelas yang akan melakukan pekerjaan.sumber
getArea()
bukan metode pabrik sama sekali .Ini benar-benar masalah selera. Kelas-kelas pabrik dapat diabstraksi / dihubung-hubungkan seperlunya, sedangkan metode pabrik lebih ringan (dan juga cenderung dapat diuji, karena mereka tidak memiliki tipe yang ditentukan, tetapi mereka akan memerlukan titik registrasi yang terkenal, seperti layanan locator tetapi untuk menemukan metode pabrik).
sumber
Kelas pabrik berguna untuk ketika jenis objek yang mereka kembalikan memiliki konstruktor pribadi, ketika kelas pabrik yang berbeda menetapkan properti yang berbeda pada objek yang kembali, atau ketika jenis pabrik tertentu digabungkan dengan jenis betonnya yang kembali.
WCF menggunakan kelas ServiceHostFactory untuk mengambil objek ServiceHost dalam situasi yang berbeda. The ServiceHostFactory standar yang digunakan oleh IIS untuk mengambil contoh ServiceHost untuk SVC file, tetapi WebScriptServiceHostFactory yang digunakan untuk layanan yang serializations kembali ke klien JavaScript. Layanan Data ADO.NET memiliki DataServiceHostFactory khusus dan ASP.NET memiliki ApplicationServicesHostFactory karena layanannya memiliki konstruktor pribadi.
Jika Anda hanya memiliki satu kelas yang mengkonsumsi pabrik, maka Anda bisa menggunakan metode pabrik dalam kelas itu.
sumber
Pertimbangkan skenario ketika Anda harus merancang kelas Pesanan dan Pelanggan. Untuk kesederhanaan dan persyaratan awal Anda tidak merasa perlu pabrik untuk kelas Order dan mengisi aplikasi Anda dengan banyak pernyataan 'Order baru ()'. Semuanya bekerja dengan baik.
Sekarang persyaratan baru muncul bahwa objek Pesanan tidak dapat dipakai tanpa asosiasi Pelanggan (ketergantungan baru). Sekarang Anda memiliki pertimbangan sebagai berikut.
1- Anda membuat kelebihan konstruktor yang hanya akan berfungsi untuk implementasi baru. (Tidak dapat diterima). 2- Anda mengubah tanda tangan Order () dan mengubah masing-masing dan setiap invokation. (Bukan latihan yang baik dan rasa sakit yang nyata).
Alih-alih Jika Anda telah membuat pabrik untuk Kelas Pesanan, Anda hanya perlu mengubah satu baris kode dan Anda dapat melakukannya. Saya menyarankan kelas Pabrik untuk hampir setiap asosiasi agregat. Semoga itu bisa membantu.
sumber
jika Anda ingin membuat objek yang berbeda dalam hal menggunakan. Ini berguna.
sumber
Setiap kelas yang menunda pembuatan objek ke sub kelasnya untuk objek yang perlu dikerjakan dapat dilihat sebagai contoh pola Pabrik.
Saya telah menyebutkan secara rinci dalam jawaban lain di https://stackoverflow.com/a/49110001/504133
sumber
Saya pikir itu akan tergantung pada derajat kopling longgar yang ingin Anda bawa ke kode Anda.
Metode pabrik memisahkan hal-hal dengan sangat baik tetapi kelas pabrik tidak.
Dengan kata lain, lebih mudah untuk mengubah hal-hal jika Anda menggunakan metode pabrik daripada jika Anda menggunakan pabrik sederhana (dikenal sebagai kelas pabrik).
Lihatlah contoh ini: https://connected2know.com/programming/java-factory-pattern/ . Sekarang, bayangkan Anda ingin membawa binatang baru. Di kelas Pabrik Anda perlu mengubah Pabrik tetapi dalam metode pabrik, tidak, Anda hanya perlu menambahkan subkelas baru.
sumber
Kelas pabrik lebih berat, tetapi memberi Anda keuntungan tertentu. Dalam kasus ketika Anda perlu membangun objek Anda dari banyak, sumber data mentah, mereka memungkinkan Anda untuk merangkum hanya logika bangunan (dan mungkin agregasi data) di satu tempat. Di sana dapat diuji secara abstrak tanpa harus peduli dengan antarmuka objek.
Saya telah menemukan ini pola yang berguna, terutama di mana saya tidak dapat mengganti dan ORM tidak memadai dan ingin secara efisien instantiate banyak objek dari tabel DB bergabung atau prosedur yang tersimpan.
sumber
Saya menyamakan pabrik dengan konsep perpustakaan. Misalnya, Anda dapat memiliki perpustakaan untuk bekerja dengan angka dan lainnya untuk bekerja dengan bentuk. Anda dapat menyimpan fungsi perpustakaan ini dalam direktori yang bernama logis sebagai
Numbers
atauShapes
. Ini adalah tipe generik yang dapat meliputi bilangan bulat, mengapung, dobules, long atau rectangles, lingkaran, segitiga, pentagon dalam hal bentuk.Petter pabrik menggunakan polimorfisme, injeksi ketergantungan dan Inversi kontrol.
Tujuan lain dari Pola Pabrik adalah:
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
Jadi katakanlah Anda sedang membangun Sistem Operasi atau Kerangka Kerja dan Anda sedang membangun semua komponen diskrit.
Berikut adalah contoh sederhana dari konsep Pola Pabrik di PHP. Saya mungkin tidak 100% pada semua itu tetapi dimaksudkan untuk menjadi contoh sederhana. Saya bukan ahli.
sumber
NumbersFactory::makeNumber( 'float', 12.5 );
memberi saya hanya mengatakannew Float(12.5);
jika saya tahu saya perluFloat
? Ini yang tidak saya mengerti tentang pabrik ... apa gunanya?