Pola Desain: Metode Pabrik vs Pabrik vs Pabrik Abstrak

183

Saya membaca pola desain dari sebuah situs web

Di sana saya membaca tentang Factory, Factory method, dan abstrak Factory tetapi mereka sangat membingungkan, tidak jelas tentang definisi. Menurut definisi

Factory - Membuat objek tanpa memaparkan logika instantiation ke klien dan merujuk ke objek yang baru dibuat melalui antarmuka umum. Adalah versi yang disederhanakan dari Metode Pabrik

Metode Pabrik - Menentukan antarmuka untuk membuat objek, tetapi biarkan subclass untuk memutuskan kelas mana yang akan dipakai dan merujuk ke objek yang baru dibuat melalui antarmuka umum.

Abstrak Pabrik - Menawarkan antarmuka untuk membuat keluarga objek terkait, tanpa secara eksplisit menentukan kelas mereka.

Saya juga melihat threadoverflow lainnya tentang Abstract Factory vs Factory Method tetapi diagram UML yang dibuat di sana membuat pemahaman saya lebih buruk.

Adakah yang bisa tolong beri tahu saya

  1. Bagaimana ketiga pola ini berbeda satu sama lain?
  2. Kapan menggunakan yang mana?
  3. Dan juga jika memungkinkan, ada contoh java yang terkait dengan pola ini?
Just_another_developer
sumber
3
Sementara saya mencari jawaban untuk pertanyaan yang kira-kira sama dengan OP, saya menemukan artikel ini: Dari Tanpa Pabrik ke Metode Pabrik . Ini memberikan wawasan dengan mengikuti evolusi proyek sampel (metode pabrik yang disebutkan dalam judul adalah salah satu langkah evolusi).
Nick Alexeev

Jawaban:

251

Ketiga jenis Pabrik melakukan hal yang sama: Mereka adalah "konstruktor pintar".

Katakanlah Anda ingin dapat membuat dua jenis Buah: Apple dan Orange.

Pabrik

Pabrik "diperbaiki", karena Anda hanya memiliki satu implementasi tanpa subklasifikasi. Dalam hal ini, Anda akan memiliki kelas seperti ini:

class FruitFactory {

  public Apple makeApple() {
    // Code for creating an Apple here.
  }

  public Orange makeOrange() {
    // Code for creating an orange here.
  }

}

Use case: Membangun Apple atau Orange agak terlalu rumit untuk ditangani dalam konstruktor untuk keduanya.

Metode Pabrik

Metode pabrik umumnya digunakan ketika Anda memiliki beberapa pemrosesan generik di kelas, tetapi ingin memvariasikan jenis buah apa yang sebenarnya Anda gunakan. Begitu:

abstract class FruitPicker {

  protected abstract Fruit makeFruit();

  public void pickFruit() {
    private final Fruit f = makeFruit(); // The fruit we will work on..
    <bla bla bla>
  }
}

... maka Anda dapat menggunakan kembali fungsi umum FruitPicker.pickFruit()dengan menerapkan metode pabrik di subclass:

class OrangePicker extends FruitPicker {

  @Override
  protected Fruit makeFruit() {
    return new Orange();
  }
}

Pabrik Abstrak

Pabrik abstrak biasanya digunakan untuk hal-hal seperti injeksi ketergantungan / strategi, ketika Anda ingin dapat membuat seluruh keluarga objek yang harus "sejenis", dan memiliki beberapa kelas dasar yang sama. Berikut ini adalah contoh yang berhubungan dengan buah. Kasus penggunaan di sini adalah bahwa kami ingin memastikan bahwa kami tidak sengaja menggunakan OrangePicker di Apple. Selama kita mendapatkan Buah dan Pemetik dari pabrik yang sama, mereka akan cocok.

interface PlantFactory {

  Plant makePlant();

  Picker makePicker(); 

}

public class AppleFactory implements PlantFactory {
  Plant makePlant() {
    return new Apple();
  }

  Picker makePicker() {
    return new ApplePicker();
  }
}

public class OrangeFactory implements PlantFactory {
  Plant makePlant() {
    return new Orange();
  }

  Picker makePicker() {
    return new OrangePicker();
  }
}
Anders Johansen
sumber
8
+1 Ini adalah jawaban yang paling mirip dengan pemahaman saya tentang pola-pola ini. Menambahkan contoh kode panggilan (Klien) juga akan membantu? Pertanyaan yang banyak mengganggu saya adalah: dapatkah kita mengatakan bahwa Pola Pabrik Abstrak hanyalah Pabrik yang diperluas dengan Pola Metode Pabrik (jika ini benar, saya jelas tentang topik ini)?
croraf
9
Ini adalah contoh yang telah saya habiskan bertahun-tahun untuk mencari.
Taztingo
Itu penjelasan yang fantastis! Terima kasih!
André Andrade
@ AndréAndrade Cara memohon Metode Pabrik ? Sebuah kode kecil samle pls :) Itu akan menghapus keraguan saya tentang penggunaannya
Arnab Dutta
25
  1. Bagaimana ketiga pola ini berbeda satu sama lain?

Factory: Membuat objek tanpa memaparkan logika instantiation kepada klien.

Metode Pabrik: Tentukan antarmuka untuk membuat objek, tetapi biarkan subclass memutuskan kelas mana yang akan dipakai. Metode Factory memungkinkan class defer instantiation ke subclass

Abstrak Pabrik: Menyediakan antarmuka untuk membuat keluarga objek terkait atau bergantung tanpa menentukan kelas konkret mereka.

AbstractFactory pola menggunakan komposisi untuk mendelegasikan tanggung jawab menciptakan objek ke kelas lain sedangkan pola desain metode pabrik menggunakan warisan dan bergantung pada kelas turunan atau sub kelas untuk membuat objek

  1. Kapan menggunakan yang mana?

Pabrik: Klien hanya perlu kelas dan tidak peduli tentang implementasi konkret yang diperolehnya.

Metode Pabrik: Klien tidak tahu kelas konkret apa yang harus dibuat saat runtime, tetapi hanya ingin mendapatkan kelas yang akan melakukan pekerjaan.

AbstactFactory: Ketika sistem Anda harus membuat banyak keluarga produk atau Anda ingin menyediakan perpustakaan produk tanpa memaparkan rincian implementasi.

Abstrak Kelas pabrik sering diterapkan dengan Metode Pabrik. Metode Pabrik biasanya disebut dalam Metode Templat.

  1. Dan juga jika memungkinkan, ada contoh java yang terkait dengan pola ini?

Pabrik dan PabrikMetode

Maksud:

Tentukan antarmuka untuk membuat objek, tetapi biarkan sub kelas memutuskan kelas mana yang akan dipakai. Metode Pabrik memungkinkan instantiasi penangguhan kelas ke sub kelas.

Diagram UML :

masukkan deskripsi gambar di sini

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:

Pola Pabrik. Kapan harus menggunakan metode pabrik?

Perbandingan dengan pola kreasi lain:

  1. Desain mulai menggunakan Metode Pabrik (kurang rumit, lebih dapat disesuaikan, subkelas berkembang biak) dan berkembang menuju Pabrik Abstrak, Prototipe, atau Builder (lebih fleksibel, lebih kompleks) ketika perancang menemukan di mana lebih banyak fleksibilitas diperlukan

  2. Abstrak Kelas pabrik sering diimplementasikan dengan Metode Pabrik , tetapi mereka juga dapat diimplementasikan menggunakan Prototipe

Referensi untuk bacaan lebih lanjut: Pembuatan pola desain

Ravindra babu
sumber
Untuk Metode Pabrik, bukankah seharusnya mendefinisikan superclass?
Tony Lin
21

Factory - Pisahkan kelas Factory untuk membuat objek yang kompleks.

Mis: kelas FruitFactory untuk membuat objek Fruit

class FruitFactory{

public static Fruit getFruit(){...}

}

Metode Pabrik - Alih-alih seluruh kelas yang terpisah untuk pabrik, cukup tambahkan satu metode di kelas itu sendiri sebagai pabrik.

Ex:

Calendar.getInstance() (Java's Calendar)

Metode Pabrik Abstrak - Pabrik Pabrik

Mis: Katakanlah kita ingin membangun pabrik untuk komponen komputer. Jadi ada beberapa jenis komputer seperti Laptop, Desktop, Server.

Jadi untuk setiap jenis komputer kita perlu pabrik. Jadi kami membuat satu pabrik tingkat tinggi seperti di bawah ini

ComputerTypeAbstractFactory.getComputerPartFactory(String computerType) ---> This will return PartFactory which can be one of these ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

Sekarang 3 ini sendiri adalah pabrik lagi. (Anda akan berurusan dengan PartFactory sendiri, tetapi di bawah tenda, akan ada implementasi terpisah berdasarkan apa yang Anda berikan di pabrik abstrak)

  Interface-> PartFactory. getComputerPart(String s), 
Implementations -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

Usage:
new ComputerTypeAbstractFactory().getFactory(“Laptop”).getComputerPart(“RAM”)

EDIT: diedit untuk menyediakan antarmuka yang tepat untuk Pabrik Abstrak sesuai dengan keberatan dalam komentar.

Ravi K
sumber
1
Gagasan di baliknya ComputerFactoryadalah Anda memiliki antarmuka pembuatan yang sama ( getScreen(); getKeyboard(); getDiskdrive(); ...), bukan antarmuka per jenis komputer seperti yang Anda sarankan. Anda dapat mencium masalah desain jika Anda menggunakan kata yang sama dua kali dalam pernyataan yang sama: Laptop Factory.get Laptop Part ().
xtofl
Tidak, tidak, jangan pergi tepat pada kode itu sendiri. Itu hanya anologi untuk pemahaman. Jika Anda ingin contoh yang tepat dengan antarmuka, ini dia. Objek: Antarmuka -> ComputerPart, Implementasi -> RAM, HDD, Pabrik Prosesor: Antarmuka-> PartFactory. getComputerPart (String s), Implementasi -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory. Pabrik Abstrak: ComputerType.getPartFactory ("String s") Penggunaan: ComputerType baru (). GetFactory ("Laptop"). GetComputerPart ("RAM")
Ravi K
2
Saya telah memperbarui jawaban untuk mengurus masalah Anda. Sebenarnya pabrik abstrak tidak lain adalah pabrik. Saya memberi contoh sebelumnya hanya untuk referensi (Dengan asumsi pembaca akan menjaga antarmuka saat implementasi aktual). Masih terima kasih telah memberi tahu. Itu selalu baik untuk ditingkatkan. :)
Ravi K
Tidak abstract Factorybukan pabrik pabrik ... Ini adalah abstract classatau interfacemampu membuat objek yang akan diimplementasikan / diperluas dengan pabrik beton yang berbeda. Lihat jawaban yang diterima untuk detail kode. Dan tolong hapus atau edit jawaban Anda sesuai dengan itu.
Julien__
Saya suka penjelasan tentang metode pabrik, yang cukup ringkas untuk mengungkap mengapa dinamakan demikian. Dalam pola ini, pabrik adalah metodenya, BUKAN kelas yang pada umumnya bukan utilitas instantiation yang mengelompokkan utilitas tetapi bermakna sendiri. Sayangnya, jawaban yang lebih rumit lainnya melewatkan poin ini.
wlnirvana
11

Setiap pola desain berkembang untuk membantu memastikan bahwa kode yang tertulis dan bekerja tidak tersentuh. Kita semua tahu bahwa begitu kita menyentuh kode kerja, ada cacat dalam alur kerja yang ada, dan lebih banyak pengujian perlu dilakukan untuk memastikan bahwa kita tidak merusak apa pun.

Pola pabrik membuat objek berdasarkan kriteria input, sehingga memastikan bahwa Anda tidak perlu menulis kode seperti jika ini kemudian membuat objek ini agak lain objek ini agak. Contoh yang baik dari ini adalah situs web perjalanan. Situs web perjalanan hanya dapat menyediakan perjalanan (penerbangan, kereta api, bus) atau / dan menyediakan hotel atau / dan menyediakan paket objek wisata. Sekarang, ketika pengguna memilih berikutnya, situs web perlu memutuskan objek apa yang perlu dibuat. Haruskah itu hanya membuat objek perjalanan atau hotel juga.

Sekarang, jika Anda membayangkan menambahkan situs web lain ke portofolio Anda, dan Anda yakin bahwa inti yang sama digunakan, misalnya, situs web carpooling, yang sekarang mencari taksi dan melakukan pembayaran online, Anda dapat menggunakan pabrik abstrak di inti Anda. Dengan cara ini Anda dapat mengambil satu pabrik taksi dan tempat parkir mobil.

Kedua pabrik tidak ada hubungannya dengan satu sama lain, jadi itu desain yang bagus untuk menjaga mereka di pabrik yang berbeda.

Semoga ini jelas sekarang. Pelajari kembali situs web ini dengan mengingat contoh ini, semoga akan membantu. Dan saya sangat berharap saya telah mewakili polanya dengan benar :).

Siddharth
sumber
3

Untuk jawaban ini, saya merujuk ke buku "Gang of Four".

Tidak ada definisi "Pabrik" atau "Pabrik Sederhana" atau "Pabrik Virtual" dalam buku ini. Biasanya ketika orang berbicara tentang pola "Pabrik" mereka mungkin berbicara tentang sesuatu yang menciptakan objek tertentu dari suatu kelas (tetapi bukan pola "pembangun"); mereka mungkin atau mungkin tidak merujuk pada pola "Metode Pabrik" atau "Pabrik Abstrak". Siapa pun dapat menerapkan "Pabrik" karena ia tidak akan melakukannya karena itu bukan istilah formal (ingatlah bahwa beberapa orang \ perusahaan \ komunitas dapat memiliki kosakata sendiri).

Buku itu saja berisi definisi untuk "Pabrik Abstrak" dan "Metode Pabrik".

Berikut adalah definisi dari buku ini dan penjelasan singkat mengapa keduanya bisa sangat membingungkan. Saya menghilangkan contoh kode karena Anda dapat menemukannya di jawaban lain:

Metode Pabrik (GOF) : Tentukan antarmuka untuk membuat objek, tetapi biarkan subclass memutuskan kelas mana yang akan dipakai. Metode Pabrik memungkinkan instantiasi penangguhan kelas ke subclass.

Abstract Factory (GOF) : Menyediakan antarmuka untuk membuat keluarga objek terkait atau bergantung tanpa menentukan kelas konkretnya.

Sumber Kebingungan : Seringkali, seseorang dapat memanggil kelas yang digunakan dalam pola "Metode Pabrik" sebagai "Pabrik". Kelas ini abstrak menurut definisi. Itu sebabnya mudah untuk menyebut kelas ini "Pabrik Abstrak". Tapi itu hanya nama kelasnya; Anda tidak harus bingung dengan pola "Pabrik Abstrak" (nama kelas! = nama pola). Pola "Pabrik Abstrak" berbeda - tidak menggunakan kelas abstrak; itu mendefinisikan antarmuka (tidak harus antarmuka bahasa pemrograman) untuk membuat bagian-bagian dari objek yang lebih besar atau objek yang terkait satu sama lain atau harus dibuat dengan cara tertentu.

Pavel Sapehin
sumber
2
AbstractProductA, A1 and A2 both implementing the AbstractProductA
AbstractProductB, B1 and B2 both implementing the AbstractProductB

interface Factory {
    AbstractProductA getProductA(); //Factory Method - generate A1/A2
}

Menggunakan Metode Pabrik, pengguna dapat membuat A1 atau A2 dari AbstractProductA.

interface AbstractFactory {
    AbstractProductA getProductA(); //Factory Method
    AbstractProductB getProductB(); //Factory Method
}

Tapi Pabrik Abstrak memiliki lebih dari 1 metode pabrik (mis: 2 metode pabrik), dengan menggunakan metode pabrik itu akan membuat set objek / objek terkait. Menggunakan Abstract Factory, pengguna dapat membuat objek A1, B1 dari AbstractProductA, AbstractProductB

rameshvanka
sumber
0

Tidak ada yang mengutip buku asli Pola Desain: Elemen Perangkat Lunak Berorientasi Objek Reusable , yang memberikan jawaban dalam dua paragraf pertama dari bagian "Diskusi Pola Penciptaan" (penekanan tambang):

Ada dua cara umum untuk membuat parameter sistem dengan kelas objek yang dibuatnya. Salah satu caranya adalah dengan subkelas kelas yang menciptakan objek; ini sesuai dengan menggunakan pola Factory Method (107). Kelemahan utama dari pendekatan ini adalah dapat membutuhkan subkelas baru hanya untuk mengubah kelas produk. Perubahan seperti itu dapat mengalir. Misalnya, ketika pembuat produk itu sendiri dibuat oleh metode pabrik, maka Anda harus mengganti pembuatnya juga.

Cara lain untuk parameterisasi sistem lebih bergantung pada komposisi objek : Tentukan objek yang bertanggung jawab untuk mengetahui kelas objek produk, dan menjadikannya parameter sistem. Ini adalah aspek kunci dari pola Abstrak Factory (87), Builder (97), dan Prototype (117). Ketiganya melibatkan pembuatan "objek pabrik" baru yang tanggung jawabnya adalah menciptakan objek produk. Abstrak Pabrik memiliki objek pabrik yang menghasilkan objek dari beberapa kelas. Builder memiliki objek pabrik yang membangun produk kompleks secara bertahap menggunakan protokol yang sesuai kompleks. Prototipe memiliki objek pabrik yang membangun produk dengan menyalin objek prototipe. Dalam hal ini, objek pabrik dan prototipe adalah objek yang sama, karena prototipe bertanggung jawab untuk mengembalikan produk.

Maggyero
sumber