Pola Factory
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 66 dari 87.
Factory Pattern adalah pola desain kreasi yang mendelegasikan pembuatan object ke method atau class terpisah. Alih-alih menggunakan new secara langsung dalam kodemu, kamu meminta factory untuk membuat object untukmu. Pola ini sangat berguna saat kamu memiliki beberapa class terkait yang menggunakan interface atau induk yang sama.
Bayangkan sistem notifikasi yang dapat mengirim email, SMS, atau notifikasi push. Tanpa factory, kodemu perlu mengetahui setiap class konkret:
// Tanpa Factory, client harus mengetahui semua class konkret
Notification notification;
if (type.equals("email")) {
notification = new EmailNotification();
} else if (type.equals("sms")) {
notification = new SMSNotification();
}Dengan Factory Pattern, kamu memusatkan logika pembuatan ini:
public interface Notification {
void send(String message);
}
public class EmailNotification implements Notification {
public void send(String message) {
System.out.println("Email: " + message);
}
}
public class SMSNotification implements Notification {
public void send(String message) {
System.out.println("SMS: " + message);
}
}
public class NotificationFactory {
public static Notification create(String type) {
if (type.equals("email")) {
return new EmailNotification();
} else if (type.equals("sms")) {
return new SMSNotification();
}
return null;
}
}Sekarang kode client lebih rapi dan tidak bergantung pada class konkret:
Notification notification = NotificationFactory.create("email");
notification.send("Hello!"); // output: Email: Hello!Manfaat utamanya adalah menambahkan jenis notifikasi baru hanya memerlukan pembaruan factory, kode client tetap tidak berubah. Ini mengikuti prinsip pemrograman ke antarmuka, sehingga sistemmu lebih fleksibel dan lebih mudah dikembangkan.
Tantangan
MudahMari bangun sistem menggambar bentuk menggunakan Factory Pattern! Alih-alih membuat object bentuk secara langsung di seluruh kodemu, kamu akan memusatkan logika pembuatannya dalam sebuah factory yang menghasilkan berbagai jenis bentuk berdasarkan pengenal string sederhana.
Kamu akan mengatur kodemu dalam empat file:
Shape.java: Definisikan interface bernamaShapeyang berfungsi sebagai kontrak umum untuk semua bentuk. Interface-mu harus mendeklarasikan satu methoddraw()yang tidak mengembalikan apa pun, tetapi mencetak informasi tentang bentuk yang sedang digambar.Shapes.java: Buat tiga class yang mengimplementasikan interfaceShape-mu:Circle- methoddraw()-nya harus mencetakDrawing a CircleRectangle- methoddraw()-nya harus mencetakDrawing a RectangleTriangle- methoddraw()-nya harus mencetakDrawing a TriangleShapeFactory.java: Buat class factory yang menangani pembuatan bentuk.ShapeFactory-mu harus memiliki method staticcreateShape(String type)yang mengembalikanShape. Berdasarkan parameter type:- Jika type sama dengan
"circle", kembalikanCirclebaru - Jika type sama dengan
"rectangle", kembalikanRectanglebaru - Jika type sama dengan
"triangle", kembalikanTrianglebaru - Untuk nilai lainnya, kembalikan
null
- Jika type sama dengan
Main.java: Satukan sistem factory-mu! Kamu akan menerima dua input: dua jenis bentuk (keduanya berupa String).Untuk setiap input, gunakan
ShapeFactory-mu untuk membuat bentuk dan menyimpannya dalam variabelShape. Jika factory mengembalikan bentuk yang valid (bukan null), panggil methoddraw()-nya. Jika factory mengembalikan null, cetakUnknown shape: [type]dengan [type] sebagai input yang diberikan.Proses kedua input secara berurutan, masing-masing pada baris output tersendiri.
Kamu akan menerima dua input secara berurutan: jenis bentuk pertama (String) dan jenis bentuk kedua (String).
Perhatikan bahwa class Main-mu tidak pernah menggunakan new Circle() atau new Rectangle() secara langsung. Class ini hanya mengetahui interface Shape dan meminta factory untuk membuat object. Inilah kekuatan Factory Pattern: kode client tidak terikat pada class konkret!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca dua jenis bentuk
String type1 = scanner.nextLine();
String type2 = scanner.nextLine();
// TODO: Gunakan ShapeFactory untuk membuat bentuk pertama
// Jika bentuknya tidak null, panggil draw()
// Jika bentuknya null, cetak "Unknown shape: [type]"
// TODO: Lakukan hal yang sama untuk bentuk kedua
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online