Tugas dalam kelas rekayasa perangkat lunak saya adalah merancang aplikasi yang dapat memainkan berbagai bentuk permainan tertentu. Gim yang dimaksud adalah Mancala, beberapa gim ini disebut Wari atau Kalah. Game-game ini berbeda dalam beberapa aspek, tetapi untuk pertanyaan saya, penting untuk mengetahui bahwa game-game tersebut dapat berbeda sebagai berikut:
- Cara penanganan suatu langkah ditangani
- Cara akhir permainan ditentukan
- Cara penentuan pemenang
Hal pertama yang muncul di benak saya untuk mendesain ini adalah menggunakan pola strategi, saya memiliki variasi dalam algoritma (aturan sebenarnya dari permainan). Desainnya bisa seperti ini:

Saya kemudian berpikir dalam permainan Mancala dan Wari cara pemenang ditentukan persis sama dan kode akan diduplikasi. Saya tidak berpikir ini dengan definisi pelanggaran 'satu aturan, satu tempat' atau prinsip KERING melihat perubahan dalam aturan untuk Mancala tidak secara otomatis berarti bahwa aturan harus diubah di Wari juga. Namun demikian dari umpan balik yang saya dapatkan dari profesor saya, saya mendapat kesan untuk menemukan desain yang berbeda.
Saya kemudian datang dengan ini:

Setiap permainan (Mancala, Wari, Kalah, ...) hanya akan memiliki atribut dari jenis antarmuka masing-masing aturan, yaitu WinnerDeterminerdan jika ada versi Mancala 2.0 yang sama dengan Mancala 1.0 kecuali untuk bagaimana pemenang ditentukan itu hanya bisa gunakan versi Mancala.
Saya pikir penerapan aturan-aturan ini sebagai pola strategi tentu valid. Tapi masalah sebenarnya datang ketika saya ingin mendesainnya lebih lanjut.
Dalam membaca tentang pola metode templat saya langsung berpikir itu bisa diterapkan untuk masalah ini. Tindakan yang dilakukan saat pengguna bergerak selalu sama, dan dalam urutan yang sama, yaitu:
- deposit batu dalam lubang (ini sama untuk semua game, jadi akan diterapkan dalam metode templat itu sendiri)
- tentukan hasil dari langkah tersebut
- tentukan apakah permainan telah selesai karena langkah sebelumnya
- jika permainan telah selesai, tentukan siapa yang telah menang
Ketiga langkah terakhir semuanya ada dalam pola strategi saya yang dijelaskan di atas. Saya mengalami banyak kesulitan menggabungkan keduanya. Salah satu solusi yang mungkin saya temukan adalah meninggalkan pola strategi dan melakukan yang berikut:

Saya tidak benar-benar melihat perbedaan desain antara pola strategi dan ini? Tetapi saya yakin saya perlu menggunakan metode templat (walaupun saya yakin harus menggunakan pola strategi).
Saya juga tidak dapat menentukan siapa yang akan bertanggung jawab untuk membuat TurnTemplateobjek, sedangkan dengan pola strategi saya merasa memiliki keluarga objek (tiga aturan) yang saya dapat dengan mudah membuat menggunakan pola pabrik abstrak. Saya kemudian akan memiliki MancalaRuleFactory, WariRuleFactory, dll dan mereka akan menciptakan contoh yang benar dari aturan dan tangan saya kembali sebuah RuleSetobjek.
Katakanlah saya menggunakan strategi + pola pabrik abstrak dan saya memiliki RuleSetobjek yang memiliki algoritma untuk tiga aturan di dalamnya. Satu - satunya cara saya merasa saya masih dapat menggunakan pola metode templat dengan ini adalah meneruskan RuleSetobjek ini ke saya TurnTemplate. 'Masalah' yang muncul kemudian adalah bahwa saya tidak akan pernah membutuhkan implementasi konkret saya TurnTemplate, kelas-kelas ini akan menjadi usang. Dalam metode saya yang dilindungi di TurnTemplatesaya hanya bisa menelepon ruleSet.determineWinner(). Sebagai konsekuensinya, TurnTemplatekelas tidak lagi abstrak tetapi harus menjadi konkret, apakah kemudian masih menjadi pola metode templat?
Ringkasnya, apakah saya berpikir dengan cara yang benar atau apakah saya kehilangan sesuatu yang mudah? Jika saya berada di jalur yang benar, bagaimana cara menggabungkan pola strategi dan pola metode templat?