Table of Contents
Pengantar Teks untuk Pola Perancangan Ciptaan
Pola desain kreasional membuat sistem independen dari bagaimana objeknya diciptakan, disusun, dan diwakili. Di antara pola GoF, Singleton dan Metode Pabrikan adalah dua dari yang paling sering dihadapi, namun mereka memecahkan masalah yang sangat berbeda. Singleton mengontrol jumlah instansi, sementara Metode Pabrikan delegasi tanggung jawab memilih kelas beton mana yang akan instantiate. Salah menentukan pola mengarah pada kode kaku, sulit untuk diuji atau kompleksitas yang tidak perlu. Artikel ini memeriksa setiap pola dalam kedalaman, mengklarifikasi konteks mereka yang sesuai, dan memberikan panduan tindakan untuk memutuskan antara insinyur.
Corak Batu Tunggal dalam Perincian
Pola Singleton ini membatasi kelas pada satu contoh dan menyediakan titik akses global pada kejadian tersebut. salah satu pola yang paling sederhana tetapi juga salah satu yang paling kontroversial karena dampaknya pada uji coba dan kudeta.
Karakteristik Intian Aksara
- [5] BAHASA [[CUBELT:0]] Nama kejadian tunggal jaminan: Konstruktor swasta mencegah instantiasi eksternal. Sebuah metode statis (sering kali ) mengembalikan kejadian tunggal.
- [[EXALT:0]]Global access: Instansi dapat diakses dari mana saja dalam aplikasi, sering kali melalui sebuah variabel atau metode statis publik.
- [[LENGGAL:0]]Lazy atau inisialisasi yang bersemangat: Instansi dapat dibuat pada waktu pemuatan kelas (eager) atau ditangguhkan sampai permintaan pertama (lazy).
Ajarlah Ketika Singleton Dianggap
- [[LLRT:0]]Berbagi sumber daya yang harus dikoordinasikan: Manajer konfigurasi, kolam benang, kolam sambungan, layanan penebangan, dan driver antarmuka perangkat keras sering kali membutuhkan tepat satu pengendali.
- [[LANFALT:0]]Global state yang tidak boleh diduplikasi: Manajer cache, lapisan abstraksi sistem berkas, atau manajer jendela dalam kerangka kerja GUI.
- [[Objek takrifan:0]]Resource-intensive: Objek yang mahal untuk dibuat dan digunakan kembali di seluruh sistem manfaat dari satu kejadian.
Pertimbangan Implementasi yang Tidak Ada
Keselamatan Bebenang Bebe adalah pitfall yang paling umum. Sebuah implementasi naif yang memeriksa untuk dan kemudian menciptakan contoh dapat menghasilkan beberapa contoh dalam lingkungan multithreaded. Solusi termasuk penguncian yang diperiksa ganda dengan , kelas batin statis (Bill Pugh singleton), atau sebuah enum berbasis tunggalton di Jawa. Dalam Python, inisialisasi thread-safe menggunakan adalah standar. Pilihan antara bersemangat dan malas tergantung pada apakah singelton dijamin untuk digunakan dan apakah penciptaannya berat.
Kritik dan Kesusahan
Singletons sering dianggap anti ⁇ pattern karena mereka memperkenalkan keadaan global, yang membuat pengujian unit sulit ⁇ ujian menjadi saling tergantung dan sulit untuk diisolasi. Mereka juga menyembunyikan dependensi; kelas yang memanggil secara langsung disatukan erat dengan kelas beton singleton. Praktik modern merekomendasikan penggunaan injeksi ketergantungan untuk memasok singelton sebagai contoh bersama, memungkinkan penggantian dengan cemoohan dalam tes. Tambahan, singleton dalam sistem terdistribusi (misalnya, layanan mikro) tidak berarti kecuali jika terskop per proses ⁇ satu instansi di seluruh jaringan membutuhkan koordinasi tambahan.
Pola Metode Pabrik Pabrik Pabrik Pabrik dalam Detail
Pola Metode Pabrik mendefinisikan antarmuka untuk menciptakan objek tetapi membiarkan subkelas memutuskan kelas mana untuk instantiate. Ini menggeser tanggung jawab penciptaan objek dari klien ke metode pabrik, mempromosikan prinsip terbuka/tertutup.
Karakteristik Intian Aksara
- [[Eflat tools]]Encapsulated kreasi logika: Kode klien tidak mengetahui kelas konkret; kode ini bekerja melalui jenis produk abstrak.
- [[ChasileFLT:0]]Extensibility: Jenis produk baru dapat ditambahkan dengan membuat pabrik beton baru tanpa memodifikasi kode klien yang ada.
- [[CharfsFLT:0]]Deferred instantiation: Kelas tepat untuk instantiate ditentukan pada waktu jalan, berdasarkan input, konfigurasi, atau konteks.
Pabrik Pabrik Pabrik Bernilai
- [[OGNOFLT:0]]Families of developed objek terkait: Ketika suatu sistem perlu bekerja dengan variasi produk multiple yang berbagi antarmuka umum ⁇ e.g., driver basis data yang berbeda, format ekspor dokumen, atau tema UI.
- [[ChalfT:0]]Menghapus kode klien dari implementasi konkret: Klien menyebut metode pabrik dan menerima objek yang sesuai dengan antarmuka abstrak. Perubahan ke kelas konkret tidak mempengaruhi klien.
- [[EfronfordFLT:0]]Konfigurasi-driven kreasi: Aplikasi dapat memutuskan pada startup pabrik beton mana yang digunakan berdasarkan berkas konfigurasi, variabel lingkungan, atau kondisi runtime.
Pertimbangan Implementasi yang Tidak Ada
Sebuah metode khas Pabrikan menggunakan kelas abstrak yang menyatakan metode pabrik (sering abstrak). Pencipta beton membatalkan metode ini untuk secara instantiate produk tertentu. Dalam bahasa tanpa warisan (misalnya, JavaScript), pabrik dapat menjadi fungsi atau penutupan. Polanya bekerja dengan baik dengan wadah injeksi ketergantungan yang dapat menggantikan implementasi. Sebuah varian umum adalah metode pabrik statis[ (misalnya, di Jawa), tetapi ini tidak sama dengan pola GoF ⁇ it Factory Method adalah metode yang lebih sederhana yang tidak melibatkan subkelas.
Contoh Dunia-Senyata: Penukar Dokumen
mempertimbangkan sebuah aplikasi yang mengubah dokumen antar format. Sebuah abstrak antarmuka mendefinisikan sebuah metode . Metode pabrik mengembalikan sebuah , , atau berdasarkan ekstensi masukan. Menambahkan format baru (misalnya, Markdown) hanya memerlukan kelas penukar baru dan memperbarui metode pabrik ⁇ tidak ada perubahan pada jalur pipa konversi.
Perbandingan Langsung: Singleton vs Metode Pabrik
Meskipun keduanya adalah pola penciptaan, tujuan dan perdagangan mereka hampir ortogonal.
| Aspect | Singleton | Factory Method |
|---|---|---|
| Primary goal | Ensure a single instance | Encapsulate object creation |
| Instance count | Exactly one | Many instances, but created through a factory |
| Control over class selection | Not relevant (always same class) | Subclasses or runtime logic choose the concrete class |
| Impact on maintainability | Can increase coupling (global access) | Reduces coupling (client depends on abstraction) |
| Testability | Often problematic (global state) | Good, as factories can be mocked |
| Extensibility | Limited (hard to subclass a singleton) | High (new products via new factories) |
Pilih Singleton ketika kekhawatiran Anda yang berlebihan adalah keunikan dan koordinasi global ⁇ misalnya, layanan logging yang harus serialisasi menulis ke berkas tunggal. Pilih Metode Pabrik ketika fokus Anda adalah pada decoupling pembuatan objek dari kode klien dan memungkinkan sistem untuk tumbuh dengan varian produk baru ⁇ misalnya, toolkit GUI yang perlu untuk memberikan tombol asli pada sistem operasi yang berbeda.
⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
Wajiz ini umum dilihat Singleton digunakan sebagai Pabrik (misalnya, singelon yang mengetahui bagaimana menciptakan berbagai objek). Pendekatan ini menggabungkan kedua pola tetapi mewarisi kelemahan negara global. Alternatif yang lebih baik adalah untuk menyuntikkan ketergantungan pabrik dan menjaga pabrik itu sendiri sebagai kelas biasa ⁇ satuton sering menjadi pilihan yang salah untuk pabrik. Jika tujuannya adalah berbagi contoh pabrik di seluruh aplikasi, sebuah wadah injeksi ketergantungan dapat mengelola kehidupan contoh tersebut tanpa untuk memaksa pola Singleton pada implementasi pabrik.
Pertimbangan Praktis untuk Aplikasi Modern
Pengujian dan Suntikan Kebergantungan
Pola kedua-dua pola yang berinteraksi dengan pengujian dengan cara yang berbeda. Singletons terkenal sulit untuk diganti dalam tes unit. Sebuah solusi umum adalah untuk memperkenalkan antarmuka untuk singleton dan menyediakan tes ganda, tetapi yang melemahkan kesederhanaan pola. Metode pabrik, di sisi lain, mudah diganti dengan menyediakan pabrik mengejek dalam tes. Dalam kerangka modern (Spring, Unity, Guice), wadah menangani singleton skoping secara otomatis, menghapus kebutuhan untuk mengimplementasikan pola secara manual.
Sistem Konkurritas dan Terdistribusi
Singleton rusak dalam sistem terdistribusi karena \"sekali kali\" tidak dapat mencakup beberapa proses atau node. Untuk sumber daya bersama di seluruh layanan mikro, insinyur menggunakan database bersama, cache seperti Redis, atau pemilihan pemimpin ⁇ bukan pola Singleton. Metode pabrik tetap dapat diterapkan bahkan dalam konteks yang didistribusikan; hanya menciptakan objek dalam setiap batas layanan.
Pola Kombinasi untuk Solusi Dunia Sejati
Banyak sistem produksi yang menggabungkan pola ini secara cerdas. Sebagai contoh, sebuah Singleton sambungan kolam mungkin menggunakan Metode Pabrik untuk membuat berbagai jenis koneksi (misalnya, baca-saja vs. baca-tulis). Singleton memastikan satu kolam per aplikasi, sementara metode pabrik menangani pembuatan objek sambungan. Contoh lain: sebuah singelton document generator yang delegasi ke metode pabrik untuk menciptakan penggambar format tertentu.
Kesalahan Umum untuk Menghindari
- Menggunakan Singleton ketika sebuah pabrik akan mencukupi: Jika Anda hanya ingin satu contoh kelas untuk alasan kinerja, suntikan ketergantungan dengan sebuah skop tunggalton lebih bersih daripada sebuah pengakses global.
- Using Metode Pabrik Ketika pembuatan objek bersifat sepele dan tetap: Jika jenis objek tidak pernah berubah dan tidak memiliki subkelas, konstruktor sederhana lebih jelas.
- [[CharlesFLT:0]]Tight coupling antara pabrik dan keluarga produk: Hindari menempatkan konfigurasi atau logika bisnis di dalam metode pabrik yang seharusnya termasuk ke tempat lain.
- [[EfolfanFLT:0]]Lupakan pengaman benang dalam singletons: Di lingkungan server, singleton non-thread-safe dapat menghasilkan keadaan korup di bawah beban.
Kekecualian Kesimpulan
Singleton dan Metode Pabrikan berfungsi secara fundamental peran yang berbeda dalam desain perangkat lunak. Singleton memberlakukan satu contoh untuk koordinasi global; Metode Pabrik abstrak penciptaan objek untuk mendukung variabilitas waktu berjalan dan ekstensibilitas. Memilih antara mereka memerlukan mengevaluasi apakah perhatian utama Anda adalah keunikan atau fleksibilitas penciptaan. Pola keduanya adalah peluru perak ⁇ masing-masing memperkenalkan trade-off dalam kemampuan uji coba, coupling, dan kompleksitas.Dengan memahami kekuatan dan keterbatasan mereka, insinyur dapat menerapkannya dengan sengaja, sering kali dalam kombinasi dengan injeksi dan kerangka kerja modern, untuk membangun sistem scal dan mempertahankan.
Untuk pembacaan lebih lanjut, lihat pola klasik GoF pada Refactoring.Guru dan Factory Method[]. Juga pertimbangkan analisis Martin Fowler tentang Registry sebagai alternatif untuk Singleton, dan artikel Wikipedia tentang Factory Method patern] untuk implementasi spesifik-bahasa.