Hai teman-teman setelah sebelumnya kita telah pendahuluan tentang pembahasan Mengenal Apa Itu Design Pattern Dan sekarang kita akan memulai dengan salah satu design pattern yang sering sekali di implementasikan yaitu Cara Menggunakan Singleton Pattern Di PHP. 

Singleton Pattern merupakan salah satu dari sekian banyak Design Pattern yang ada, dimana singleton ini banyak sekali di implementasikan nah di sini kita akan mencoba prakteknya menggunakan PHP sebagai bahasa pemprogramanya.

Di sini kita akan langsung praktik coding agar teman-teman bisa dengan mudah memahami apa bila kita praktik langsung .

Oke saya memiliki kasus seperti berikut ini dimana saya memiliki 1 class dengan nama SaveProducts.php :

<?php

use Services\OrderService;
use Services\OrderDetailService;

class SaveProducts {
    
    public function orderSave()
    {
        $OrderService = new OrderService();
        $OrderDetailService = new OrderDetailService();
        $OrderService->save(['order_id' => 1]);
        $OrderDetailService->save([
            ['order_id' => 1, 'product' => 'pop mie'],
            ['order_id' => 1, 'product' => 'kamper'],
            ['order_id' => 1, 'product' => 'obat batuk'],
            ['order_id' => 1, 'product' => 'vitamin'],
        ]);

    }
    
}

Kasusnya adalah pada class SaveProducts memiliki method untuk melakukan save product ke table order dan order_detail. Bisa di lihat kita membuat 2 buah object agar bisa menggunakan method save yang ada di masing-masing class service nya ya. BTW untuk mengikuti pembahasan kali ini wajib sudah tau dan belajar Object Oriented Programming.

Untuk selanjutnya kita buat class service nya dimana ada 2 class yang di gunakan yang pertama adalah OrderService.php :

<?php

namespace Services;

use Helppers\ConnectionPDO;

class OrderService {
   
    public function save($data)
    {
        $pdo = new ConnectionPDO();
        $sql = "INSERT INTO order_detail ('order_id', 'product') VALUES ($data)";
        $pdo->prepare($sql)->execute();

    }

}

lalu class service yang ke dua adalah OrderDetailService.php :

<?php

namespace Services;

use Helppers\ConnectionPDO;

class OrderDetailService {
   
    public function save($data)
    {
        $pdo = new ConnectionPDO();
        $sql = "INSERT INTO order ('order_id') VALUES ($data)";
        $pdo->prepare($sql)->execute();
    }

}

oke kita akan bedah satu persatu ya, mungkin ini akan sulit di pahami karena menjelaskan design pattern kurang maksimal apabila menggunakan mesia teks :).

Di class SaveProducts kita membuat 2 buah object dimana object tersebut berasal dari 2 class service yang kita buat yaitu OrderService dan OrderDetailService yang perlu teman-teman perhatikan adalah 2 buah class service nya dimana masing-masing memiliki sebuah fungsi untuk melakukan perintah SQl query yaitu insert.

Dimana jika kita melakukan sebuah perintah SQL entah itu menggunakan databasenya MYSQL/postgreSQL kita tetap membutuhkan sebuah koneksi agar aplikasi kita bisa terhubung atau terjembatani dengan database tersebut.

Coba teman-teman bayangkan jika setiap aksi perintah SQL kita melakukan koneksi ke database apa bila trafic sedang tinggi-tingginya misal kita ambil 100 pengunjung tetapi koneksi ke data base kita bisa 200 koneksi. Loh kok bisa ? uuser n ya 100 tetapi konksi ke database 200 konkesi.

Hal itu bisa terjadi di karenakan kita menggunakan 2 perintah save pada satu kali aksi pada baris kode berikut :

$OrderService = new OrderService();
        $OrderDetailService = new OrderDetailService();
        $OrderService->save(['order_id' => 1]);// ini perintah save dari class service OrderService
        $OrderDetailService->save([ // ini juga perintah save dari class service $OrderDetailService
            ['order_id' => 1, 'product' => 'pop mie'],
            ['order_id' => 1, 'product' => 'kamper'],
            ['order_id' => 1, 'product' => 'obat batuk'],
            ['order_id' => 1, 'product' => 'vitamin'],
        ]);

Dimana masing class-class tersebut melakukan koneksi ke database. Nah jika kasus itu terjadi dengan trafic yang tinggi ini dapat memakan resource yang cukuo tinggi dan akan sangat mubajir ya.

Untuk menyeksaikan masalah tersebut kita dapat menggunakan Singleton pattern, Inti dari singleton pattern ini adalah diamana kita membuat 1 class lalu kita bisa membuat object nya di masing-masing service nya yang membutuhkan class tersebut.  Pada kasus ini kita akan buat 1 class koneksi bernama ConnectionPDO :

<?php

namespace Helppers;

class ConnectionPDO {

    public function connectPdo()
    {
        $host = 'localhost';
        $db   = 'ecomerce';
        $user = 'root';
        $pass = '';
        $charset = 'utf8mb4';

        $options = [
            \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
            \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
            \PDO::ATTR_EMULATE_PREPARES   => false,
        ];
        $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
        try {
            $pdo = new \PDO($dsn, $user, $pass, $options);
        } catch (\PDOException $e) {
            throw new \PDOException($e->getMessage(), (int)$e->getCode());
        }
    }
}

pada class di atas kita membuat 1 method yang isinya adalah perintah melakukan koneksi ke database menggunakan Driver PDO .  Lalu untuk menggunakanya kita hanya perlu melakukan instansiasi di masing-masing service yang membutuhkan konksi tersebut seperti yang sudah kita lakukan di masin-masing class servicenya pada baris kode berikut ini :

$pdo = new ConnectionPDO();

Kesimpulan dari yang telah kita buat Singlton pattern ini mirip sekali dengan helpper jika bisanya kita hanya tau menggunakanya saja sekarang kita bisa tahu bahwa Pattern tersebut dapat kita gunakan untuk kasus-kasus lain yang memilik penyelsaian yang sama.