Apa perbedaan antara pola Pabrik dan Strategi?

Jawaban:

226

Pola pabrik adalah pola penciptaan. Pola strategi adalah pola operasional. Dengan kata lain, pola pabrik digunakan untuk membuat objek dari tipe tertentu. Pola strategi digunakan untuk melakukan operasi (atau serangkaian operasi) dengan cara tertentu. Dalam contoh klasik, pabrik dapat membuat berbagai jenis Hewan: Anjing, Kucing, Harimau, sementara pola strategi akan melakukan tindakan tertentu, misalnya, Pindah; menggunakan strategi Run, Walk, atau Lope.

Bahkan keduanya bisa digunakan bersama. Misalnya, Anda mungkin memiliki pabrik yang menciptakan objek bisnis Anda. Itu mungkin menggunakan strategi yang berbeda berdasarkan pada media kegigihan. Jika data Anda disimpan secara lokal dalam XML, itu akan menggunakan satu strategi. Jika data jauh di database yang berbeda, itu akan menggunakan yang lain.

tvanfosson
sumber
1
`Pola strategi digunakan untuk melakukan operasi (atau serangkaian operasi) dengan cara tertentu` Apakah itu berarti operasi lebih dari objek?
OPV
32

Pola strategi memungkinkan Anda untuk secara polimorfis mengubah perilaku suatu kelas.

Pola pabrik memungkinkan Anda untuk merangkum pembuatan objek.

Gary membuat poin yang bagus. Jika Anda menggunakan prinsip pengkodean untuk abstraksi daripada "concretions" maka banyak pola mulai tampak seperti variasi pada suatu tema.

jlembke
sumber
25

Hanya untuk menambah apa yang dikatakan tvanfosson, banyak pola terlihat sama sejauh implementasi. Yaitu, banyak yang sudah Anda buat antarmuka di mana mungkin tidak ada satu sebelumnya dalam kode Anda, dan kemudian buat banyak implementasi dari antarmuka itu. Perbedaannya adalah dalam tujuan mereka dan bagaimana mereka digunakan.

Gary Kephart
sumber
13
  • Pola Pabrik (metode).

Buat hanya contoh nyata. Argumen yang berbeda dapat menghasilkan objek yang berbeda. Itu tergantung pada logika dll.

  • Pola Strategi.

Enkapsulasi algoritma (langkah-langkah) untuk melakukan suatu tindakan. Jadi Anda bisa mengubah strategi dan menggunakan algoritma lain.

Walaupun keduanya terlihat sangat mirip, tujuannya agak berbeda, satu tujuan adalah untuk menciptakan yang lain adalah untuk melakukan suatu tindakan.

Begitu. Jika metode Pabrik Anda diperbaiki, Anda mungkin memilikinya seperti ini:

 public Command getCommand( int operatingSystem ) { 
      switch( operatingSystem ) { 
           case UNIX    :
           case LINUX   : return new UnixCommand();
           case WINDOWS : return new WindowsCommand();
           case OSX     : return new OSXCommand();
       }
  }

Tetapi anggaplah pabrik Anda membutuhkan kreasi yang lebih maju atau dinamis. Anda dapat menambahkan strategi metode pabrik dan mengubahnya tanpa harus mengkompilasi ulang, strategi dapat berubah saat runtime.

OscarRyz
sumber
Saya tidak berpikir Anda membuat poin yang benar di sini. Pertama-tama, salah satu alasan dari pola-pola ini adalah untuk menghindari persyaratan yang mendukung polimorfisme. Pertama-tama, perbedaan antara pabrik sederhana dan pabrik abstrak harus dibuat. Yang pertama adalah pabrik sederhana di mana Anda hanya memiliki satu kelas yang bertindak sebagai pabrik untuk pembuatan objek, sedangkan di yang terakhir Anda terhubung ke antarmuka dan kemudian memanggil pabrik yang berbeda yang mengimplementasikan antarmuka ini yang seharusnya memiliki implementasi yang berbeda dari metode yang sama berdasarkan beberapa kriteria. (lanjutan)
interboy
4
Tepat dalam kasus ini, ini menghasilkan semacam pola strategi, tetapi berbeda darinya secara semantik karena digunakan untuk OBJECT CREATION daripada operasi. Jadi, pada dasarnya Anda memiliki pembuatan objek menggunakan strategi yang berbeda.
interboy
2
@OscarRyz Bisakah Anda memperbarui jawaban Anda dengan sebuah program yang menggambarkan keduanya
Prakash Pandey
11

Pertama-tama, perbedaan antara pabrik sederhana dan pabrik abstrak harus dibuat. Yang pertama adalah pabrik sederhana di mana Anda hanya memiliki satu kelas yang bertindak sebagai pabrik untuk pembuatan objek, sedangkan di kelas yang lain Anda terhubung ke antarmuka pabrik (yang mendefinisikan nama metode) dan kemudian memanggil berbagai pabrik yang mengimplementasikan antarmuka ini yang seharusnya memiliki implementasi yang berbeda dari metode yang sama berdasarkan beberapa kriteria. Sebagai contoh, kami memiliki antarmuka ButtonCreationFactory, yang diimplementasikan oleh dua pabrik, WindowsButtonCreationFactory pertama (membuat tombol dengan tampilan dan nuansa Windows) dan LinuxButtonCreationFactory kedua (membuat tombol dengan tampilan dan nuansa Linux). Jadi kedua pabrik ini memiliki metode pembuatan yang sama dengan implementasi yang berbeda (algoritma).

Misalnya jika Anda ingin tombol dengan Linux terlihat dan terasa:

ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);

atau jika Anda ingin tombol Windows

ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);

Tepat dalam kasus ini, ia menghasilkan semacam pola strategi, karena ia membedakan algoritma untuk melakukan beberapa kreasi. Namun, itu berbeda dari itu secara semantik karena digunakan untuk OBJECT CREATION daripada algoritma operasional. Jadi, pada dasarnya dengan pabrik abstrak Anda memiliki pembuatan objek menggunakan strategi yang berbeda, yang membuatnya sangat mirip dengan pola strategi. Namun AbstractFactory bersifat kreatif, sedangkan pola Strategi operasional. Dari segi implementasi, hasilnya sama saja.

interboy
sumber
10

Factory (dan FactoryMethod dikembalikan oleh Factory) :

  1. Pola penciptaan
  2. Berdasarkan warisan
  3. Factory mengembalikan Factory Method (antarmuka) yang pada gilirannya mengembalikan Objek Beton
  4. Anda dapat mengganti objek beton baru untuk antarmuka dan klien (pemanggil) tidak harus menyadari semua implementasi nyata
  5. Klien selalu mengakses antarmuka saja dan Anda dapat menyembunyikan detail pembuatan objek dalam metode Pabrik

Lihat artikel wikipedia ini dan artikel yang dikunjungi di internet

Pola strategi:

  1. Itu adalah pola perilaku
  2. Ini didasarkan pada delegasi
  3. Ini mengubah isi objek dengan memodifikasi perilaku metode
  4. Ini digunakan untuk beralih di antara keluarga algoritma
  5. Itu mengubah perilaku objek pada saat run time

Contoh:

Anda dapat mengonfigurasi strategi Diskon untuk item tertentu (tiket AirFare atau item ShoppingCart). Dalam contoh ini, Anda akan menawarkan diskon 25% untuk item selama bulan Juli - Desember dan Tidak ada diskon untuk item tersebut selama Jaunary - Juni.

Pos terkait:

Contoh Dunia Nyata dari Pola Strategi

Pola Desain: Metode Pabrik vs Pabrik vs Pabrik Abstrak

Ravindra babu
sumber
3

Untuk memperluas apa yang dikatakan Oscar dan mengacu pada kode-nya:

GetCommand adalah Factory dan kelas UnixCommand, WindowsCommand dan OSXCommand adalah Strategi


sumber
3

Pola strategi dalam istilah sederhana lebih merupakan penciptaan perilaku runtime di mana Anda tidak peduli dengan kelas implementasi. Di pabrik lain adalah pembuatan runtime instance kelas beton dan terserah kepada Anda untuk menggunakan perilaku (metode) yang diekspos oleh antarmuka yang diimplementasikan.

Gurum
sumber
2

Anda tidak dapat memahami perbedaannya hanya dengan melihat kode atau kategorisasi. Untuk memahami pola GoF dengan benar, cari maksudnya:

Strategi: "Definisikan sekumpulan algoritme, enkapsulasi masing-masing, dan buatlah itu dapat dipertukarkan. Strategi memungkinkan algoritme berbeda dari klien yang menggunakannya."

Metode Pabrik: "Tentukan antarmuka untuk membuat objek, tetapi biarkan subclass memutuskan kelas mana yang akan dipakai. Metode Pabrik memungkinkan kelas menunda instantiasi ke subclass."

Dan inilah penjelasan terperinci tentang maksud dan perbedaan antara dua pola ini: Perbedaan antara Metode Pabrik dan pola desain Strategi

Cristik
sumber
1

Saya mungkin ngelantur dengan Oscar karena contoh penerapan Pabriknya agak erat dan sangat tertutup, tidak heran pilihan Anda adalah pola Strategi. Implementasi Pabrik tidak boleh bergantung pada jumlah tertentu dari kelas tertentu yang sedang dipakai, misalnya:

public Command getCommand( int operatingSystem ) {        
   return commandTable.get(operatingSystem); 
}

...

public class WindowsCommand implements Command {
    ...
    static {
        CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
    }

}

Saya kira kriteria yang paling tepat untuk memilih satu atau yang lain sebagian besar adalah istilah yang Anda terapkan untuk menyebutkan kelas dan metode Anda, dengan mempertimbangkan kita semua harus cenderung memprogram untuk antarmuka dan bukan ke kelas dan juga fokus pada tujuan: kami bertujuan untuk menentukan kode mana yang akan dieksekusi saat runtime. Yang mengatakan, kita dapat mencapai tujuan dengan menggunakan salah satu dari kedua pola tersebut.

Rick B.
sumber
1

Strategi dan Pabrik adalah tujuan yang berbeda. Dalam strategi Anda memiliki pendekatan yang ditentukan, menggunakan pola ini Anda dapat menukar perilaku (algoritma). Datang ke Pabrik ada banyak variasi di sekitar. Tetapi pola asli dari GO4 menyatakan pabrik meninggalkan pembuatan objek ke kelas anak. Di sini dengan pabrik Anda mengganti contoh lengkap bukan perilaku yang Anda minati. Dengan ini Anda akan mengganti sistem lengkap bukan algoritma.

Gagasan
sumber
0

Pola pabrik adalah pola kreasi, yang dibuat dengan properti yang ditentukan (perilaku). sementara pada saat dijalankan setelah pembuatan Anda tidak dapat mengubah sifat (perilaku) itu. jadi jika Anda memerlukan properti yang berbeda (perilaku) Anda harus menghapus objek dan membuat objek baru dengan properti yang diperlukan (perilaku). yang tidak gud. sedangkan dalam hal pola strategi, Anda dapat mengubah properti (perilaku) pada saat dijalankan.

pengguna1808932
sumber