“Metode Pabrik adalah spesialisasi Metode Templat”. Bagaimana?


10

Persamaan dan perbedaan antara keduanya:

Metode Templat

  • Bergantung pada warisan.
  • Menentukan langkah-langkah suatu algoritma, dan meninggalkan tugas mengimplementasikannya ke subclass.

Metode Pabrik

  • Bergantung pada warisan.
  • Superclass mendefinisikan antarmuka untuk membuat objek. Subkelas memutuskan kelas konkret mana yang akan dipakai.

Dua berdampingan:

masukkan deskripsi gambar di sini

Saya tidak yakin apa arti frasa "Metode Pabrik adalah spesialisasi Metode Templat" (ada di buku Pola Desain Kepala Pertama ). Di Beveragekami memiliki metode prepareyang finaldan mendefinisikan serangkaian langkah-langkah. Dalam PizzaStorekita memiliki metode yang abstract, dan subkelas mendefinisikannya kembali. Bagaimana yang terakhir merupakan spesialisasi dari yang pertama?


5
Saya melihat banyak downvotes pada pos ini dari polisi pola. Tidak ada alasan untuk itu; Anda sekarang memiliki tiga orang yang mengatakan bahwa frasa tersebut mungkin keliru. Catatan untuk pembaca posting ini: jangan percaya semua yang Anda baca di buku atau online.
Robert Harvey

Jawaban:


6

Dalam Beveragekita memiliki metode ("template") prepareyang memanggil beberapa metode abstrak seperti boilWater, brewdll. Yang diimplementasikan dalam subkelas Ini pada dasarnya bukan untuk pola untuk memiliki metode templat yang terletak di kelas dasar, bisa saja di tempat lain, asumsikan metode abstrak bersifat publik. Tetapi pada dasarnya ada metode abstrak yang harus diganti dan akan mengisi celah dalam "templat algoritma".

Metode pabrik juga tentang kelas di mana metode abstrak ditimpa, titik inti adalah penelepon metode itu tidak perlu tahu jenis yang tepat dari objek yang dibuat. Perhatikan bahwa dalam PizzaStore, metode abstrak createPizzaharus dipanggil dari suatu tempat - katakanlah sebuah metode createLotsOfPizza.

Ini menjadikan yang terakhir metode templat, di mana langkah-langkah spesifik dari "algoritma untuk membuat pizza" adalah celah yang harus diisi. Sekarang mungkin hanya penggunaan kata-kata yang tidak tepat dengan mengatakan "pola metode pabrik" adalah kasus khusus dari pola "metode templat". Terutama "metode pabrik" bukan "metode templat", namun mereka mungkin dipanggil dari metode templat. Jadi lebih tepatnya, bisa kita katakan

"pola metode pabrik biasanya digunakan bersama dengan kasus khusus dari pola metode templat"

dan saya kira itulah yang ingin diungkapkan oleh penulis buku itu.


2

Saya pikir "Metode Pabrik adalah spesialisasi Metode Templat" adalah kesalahan karakterisasi. Saya percaya bahwa akan lebih akurat untuk mengatakan bahwa pola Metode Template hanyalah variasi pada pola Metode Pabrik.

Lebih lanjut, saya mengklaim bahwa pola Metode Templat sama sekali bukan pola sama sekali (dalam pengertian Gang of Four), karena pola tersebut muncul secara alami melalui pewarisan dan penimpaan metode. Anda dapat melihat bahwa, dalam diagram di atas untuk Pola Templat, kelas turunan hanya menimpa metode di kelas dasar dengan perilaku mereka sendiri.

Secara keseluruhan, Pola Perangkat Lunak (dari variasi Geng Empat) benar-benar hanya solusi untuk kekurangan dalam bahasa pemrograman, dan Pola Template hanya menyatakan kembali apa yang sudah mampu dilakukan oleh bahasa berorientasi objek.


Jika Anda menggunakan definisi pola desain yang membuat Metode Templat bukan pola desain, saya pikir definisi Anda salah. Pola desain adalah ide abstrak yang menyampaikan hubungan antara berbagai bagian kode Anda, dan tidak ada hubungannya dengan bahasa yang digunakan. Pola desain bukan detail implementasi, melainkan deskripsi yang dapat digunakan pada level tinggi dalam untuk mengkomunikasikan keputusan desain yang telah dibuat mengenai bagian dari suatu sistem.
Jules

Lebih khusus lagi, Metode Templat adalah cara khusus menggunakan warisan yang berguna dalam beberapa keadaan, tetapi jelas merupakan keputusan desain karena ada cara lain untuk mencapai tujuan yang sama (efek yang sama dapat dicapai, misalnya, menggunakan agregasi, dalam hal ini mungkin akan dianggap sebagai contoh dari pola Strategi). Mengingat bahwa keputusan sedang dibuat, sebuah nama penting untuk memungkinkan kita berbicara tentang keputusan itu, dan di mana kita memiliki nama seperti itu adalah pola desain.
Jules

1

Saya akan mengatakan Kepala Pertama benar-benar salah dalam karakterisasi ini.

Wikipedia mendefinisikan Metode Templat sebagai:

Dalam rekayasa perangkat lunak, pola metode templat adalah pola desain perilaku yang mendefinisikan kerangka program suatu algoritma dalam operasi, menunda beberapa langkah untuk subkelas.

(Ini referensi GoF untuk itu.)

Dan Metode Pabrik didefinisikan sebagai:

Dalam pemrograman berbasis kelas, pola metode pabrik adalah pola kreatif yang menggunakan metode pabrik untuk menangani masalah membuat objek tanpa harus menentukan kelas objek yang tepat yang akan dibuat.

Tidak ada tumpang tindih antara keduanya, kecuali bahwa dalam C ++, warisan adalah bagian kunci dari keduanya. Namun, dalam bahasa yang membuat perbedaan antara warisan implementasi ( extendsdi Jawa) dan implementasi antarmuka ( implementsdi Jawa), bahkan kesamaan ini tidak ada, karena implementasi antarmuka cukup untuk metode pabrik, tetapi bukan metode templat. Dan di C ++, warisan implementasi murni (tanpa warisan antarmuka, yaitu warisan pribadi atau CRTP) dapat digunakan untuk yang pertama, tetapi tidak untuk yang terakhir.

Dan selain itu? Salah satunya adalah pola desain perilaku, yang lain adalah pola penciptaan. Satu menggambarkan garis besar operasi, dengan beberapa bagian penting ditinggalkan untuk diisi oleh subclass khusus; yang lain menentukan kontrak yang sangat sederhana, meninggalkan seluruh implementasi pada contoh nyata. Mereka sangat berbeda.

Menurut pendapat saya, kalimat yang dikutip itu salah. Entah itu kesalahan mencolok dalam buku ini, atau (kecil kemungkinannya) di luar konteks dan harus ditafsirkan secara berbeda.


Saya pikir pernyataan itu tidak jelas "salah", itu hanya penggunaan kata-kata yang ceroboh. Lihat hasil edit saya.
Doc Brown
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.