Memahami perbedaan dalam motivasi:
Misalkan Anda sedang membangun alat di mana Anda memiliki objek dan implementasi konkret dari keterkaitan objek. Karena Anda memperkirakan variasi dalam objek, Anda telah membuat tipuan dengan menetapkan tanggung jawab untuk membuat varian objek ke objek lain ( kami menyebutnya pabrik abstrak ). Abstraksi ini menemukan manfaat yang kuat karena Anda memperkirakan ekstensi di masa depan membutuhkan varian dari objek-objek tersebut.
Motivasi lain yang agak menarik dalam garis pemikiran ini adalah kasus di mana setiap-atau-tidak ada objek dari seluruh kelompok akan memiliki varian yang sesuai. Berdasarkan beberapa kondisi, salah satu varian akan digunakan dan dalam setiap kasus semua objek harus memiliki varian yang sama. Ini mungkin agak kontra intuitif untuk dipahami karena kita sering cenderung berpikir bahwa - selama varian objek mengikuti kontrak seragam yang sama ( antarmuka dalam arti yang lebih luas ), kode implementasi konkret tidak boleh rusak. Fakta menarik di sini adalah bahwa, tidak selalu ini benar terutama ketika perilaku yang diharapkan tidak dapat dimodelkan oleh kontrak pemrograman.
Sederhana ( meminjam ide dari GoF ) adalah setiap aplikasi GUI mengatakan monitor virtual yang meniru tampilan MS atau Mac atau Fedora OS. Di sini, misalnya, ketika semua objek widget seperti jendela, tombol, dll. Memiliki varian MS kecuali bilah gulir yang berasal dari varian MAC, tujuan alat gagal parah.
Kasus-kasus di atas membentuk kebutuhan mendasar Pola Pabrik Abstrak .
Di sisi lain, bayangkan Anda sedang menulis kerangka kerja sehingga banyak orang dapat membangun berbagai alat ( seperti yang ada di contoh di atas ) menggunakan kerangka kerja Anda. Dengan gagasan kerangka kerja, Anda tidak perlu, meskipun Anda tidak bisa menggunakan objek konkret dalam logika Anda. Anda lebih suka menaruh beberapa kontrak tingkat tinggi antara berbagai objek dan bagaimana mereka berinteraksi. Meskipun Anda ( sebagai pengembang kerangka kerja ) tetap pada tingkat yang sangat abstrak, setiap pembangun alat dipaksa untuk mengikuti konstruksi kerangka Anda. Namun, mereka ( pembangun alat ) memiliki kebebasan untuk memutuskan objek apa yang akan dibangun dan bagaimana semua objek yang mereka buat akan berinteraksi. Berbeda dengan kasus sebelumnya ( Pola Pabrik Abstrak ), Anda ( sebagai pembuat kerangka) tidak perlu bekerja dengan benda konkret dalam kasus ini; dan lebih tepatnya bisa tetap di level kontrak objek. Selain itu, tidak seperti bagian kedua dari motivasi sebelumnya, Anda atau pembuat alat tidak pernah memiliki situasi pencampuran objek dari varian. Di sini, sementara kode kerangka kerja tetap pada tingkat kontrak, setiap pembangun-alat dibatasi ( oleh sifat kasus itu sendiri ) untuk menggunakan objek mereka sendiri. Kreasi objek dalam hal ini didelegasikan kepada masing-masing pelaksana dan penyedia kerangka kerja hanya menyediakan metode yang seragam untuk membuat dan mengembalikan objek. Metode tersebut tidak dapat dihindari bagi pengembang kerangka untuk melanjutkan dengan kode mereka dan memiliki nama khusus yang disebut metode Pabrik ( Pola Metode Pabrik untuk pola yang mendasarinya ).
Beberapa Catatan:
- Jika Anda terbiasa dengan 'metode templat', maka Anda akan melihat bahwa metode pabrik sering dipanggil dari metode templat jika program terkait dengan segala bentuk kerangka kerja. Sebaliknya, metode templat dari program aplikasi sering kali merupakan implementasi sederhana dari algoritma tertentu dan tidak memiliki metode pabrik.
- Selanjutnya, untuk kelengkapan pemikiran, menggunakan kerangka kerja ( disebutkan di atas ), ketika seorang pembuat alat sedang membangun alat, di dalam setiap metode pabrik, alih-alih membuat objek konkret, ia dapat mendelegasikan tanggung jawab lebih lanjut ke abstrak objek -pabrik, asalkan pembuat-alat memperkirakan variasi objek konkret untuk ekstensi di masa mendatang.
Kode sampel:
//Part of framework-code
BoardGame {
Board createBoard() //factory method. Default implementation can be provided as well
Piece createPiece() //factory method
startGame(){ //template method
Board borad = createBoard()
Piece piece = createPiece()
initState(board, piece)
}
}
//Part of Tool-builder code
Ludo inherits BoardGame {
Board createBoard(){ //overriding of factory method
//Option A: return new LudoBoard() //Lodu knows object creation
//Option B: return LudoFactory.createBoard() //Lodu asks AbstractFacory
}
….
}
//Part of Tool-builder code
Chess inherits BoardGame {
Board createBoard(){ //overriding of factory method
//return a Chess board
}
….
}