ภาพรวม
ตัวอย่างนี้สาธิตการใช้ Singleton เพื่อจัดการ Alert Dialog แบบรวมศูนย์ (Centralized) ลดโค้ดซ้ำเมื่อต้องแสดง Dialog แบบเดียวกันหลายจุดในแอป
ขั้นตอนการสร้าง
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
Android Studio → File → New Project → กรอกรายละเอียด
ขั้นตอนที่ 2: จัดรูปแบบหน้าจอ (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/show"
android:text="Alert Dialog จาก Singleton"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
ขั้นตอนที่ 3: เขียนโค้ด MainActivity (src/MainActivity.java)
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button show;
SingleTonExample singletonExample;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = findViewById(R.id.show);
singletonExample = SingleTonExample.getInstance();
singletonExample.init(getApplicationContext());
show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
singletonExample.showAlertDialog(MainActivity.this);
}
});
}
}
ขั้นตอนที่ 4: สร้างคลาส Singleton (SingleTonExample.java)
package com.example.andy.myapplication;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.Toast;
public class SingleTonExample {
private static SingleTonExample ourInstance = new SingleTonExample();
private Context appContext;
private SingleTonExample() { }
public static Context get() {
return getInstance().getContext();
}
public static synchronized SingleTonExample getInstance() {
return ourInstance;
}
public void init(Context context) {
if (appContext == null) {
this.appContext = context;
}
}
private Context getContext() {
return appContext;
}
public void showAlertDialog(final MainActivity activity) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("คุณแน่ใจหรือไม่ ที่ต้องการตัดสินใจนี้?");
builder.setPositiveButton("ใช่", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(activity, "คุณกดปุ่ม ใช่", Toast.LENGTH_LONG).show();
}
});
builder.setNegativeButton("ไม่", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
activity.finish();
}
});
builder.create().show();
}
}
การทดสอบ
รันแอปพลิเคชัน หน้าจอเริ่มต้นแสดงตามภาพ

คลิกปุ่ม จะแสดง Alert Dialog จาก Singleton Class

การปรับปรุงสำหรับการใช้งานจริง (Production Ready)
1. ทำให้ Dialog แบบ Generic/Reusable
public class DialogManager {
private static DialogManager instance = new DialogManager();
public static DialogManager getInstance() { return instance; }
private DialogManager() {}
public void showConfirmDialog(Context context,
String title,
String message,
String positiveText,
String negativeText,
OnDialogActionListener listener) {
new AlertDialog.Builder(context)
.setTitle(title)
.setMessage(message)
.setPositiveButton(positiveText, (d, w) -> listener.onPositive())
.setNegativeButton(negativeText, (d, w) -> listener.onNegative())
.setCancelable(false)
.show();
}
public interface OnDialogActionListener {
void onPositive();
void onNegative();
}
}
// Usage
DialogManager.getInstance().showConfirmDialog(
this, "ยืนยัน", "ลบข้อมูลนี้หรือไม่?", "ลบ", "ยกเลิก",
new DialogManager.OnDialogActionListener() {
@Override public void onPositive() { deleteData(); }
@Override public void onNegative() { /* do nothing */ }
}
);
2. ใช้ DialogFragment (แนะนำ)
public class ConfirmDialogFragment extends DialogFragment {
public static ConfirmDialogFragment newInstance(String title, String message) {
ConfirmDialogFragment fragment = new ConfirmDialogFragment();
Bundle args = new Bundle();
args.putString("title", title);
args.putString("message", message);
fragment.setArguments(args);
return fragment;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(requireActivity())
.setTitle(getArguments().getString("title"))
.setMessage(getArguments().getString("message"))
.setPositiveButton("ใช่", (d, w) ->
((OnConfirmListener)requireActivity()).onConfirm(true))
.setNegativeButton("ไม่", (d, w) ->
((OnConfirmListener)requireActivity()).onConfirm(false))
.create();
}
public interface OnConfirmListener {
void onConfirm(boolean confirmed);
}
}
ข้อดีของ DialogFragment
- จัดการ Lifecycle เอง รอดชีวิต Configuration Change
- ไม่ Leak Context
- รองรับ Back Stack การนำทาง
- ทดสอบได้ง่ายกว่า
สรุป
Singleton Alert Dialog เหมาะสำหรับ Dialog เรียบง่ายที่ใช้บ่อยและไม่ซับซ้อน สำหรับแอปพลิเคชันขนาดใหญ่ ควรใช้ DialogFragment หรือ Jetpack Compose Dialog แทน