Tôi biết điều này đã cũ, nhưng câu trả lời của Dr8k gần như đã có.
Khi bạn đang cân nhắc viết một đoạn mã, hãy giả sử rằng nó sẽ thay đổi. Điều đó không có nghĩa là bạn đang giả định các loại thay đổi mà nó sẽ tồn tại vào một thời điểm nào đó trong tương lai, mà là một số hình thức thay đổi sẽ được thực hiện.
Biến nó thành một mục tiêu để giảm thiểu nỗi đau của việc thực hiện thay đổi trong tương lai: một toàn cầu rất nguy hiểm vì rất khó để quản lý ở một vị trí duy nhất. Điều gì xảy ra nếu tôi muốn làm cho bối cảnh kết nối cơ sở dữ liệu đó nhận biết được trong tương lai? Điều gì sẽ xảy ra nếu tôi muốn nó đóng và tự mở lại sau mỗi lần thứ 5 nó được sử dụng. Điều gì sẽ xảy ra nếu tôi quyết định rằng vì lợi ích của việc mở rộng ứng dụng của mình, tôi muốn sử dụng nhóm 10 kết nối? Hoặc số lượng kết nối có thể định cấu hình?
Một nhà máy singleton cung cấp cho bạn sự linh hoạt đó. Tôi thiết lập nó với rất ít phức tạp và đạt được nhiều hơn là chỉ truy cập vào cùng một kết nối; Tôi có khả năng thay đổi cách kết nối đó được truyền cho tôi sau này một cách đơn giản.
Lưu ý rằng tôi nói nhà máy singleton trái ngược với chỉ đơn giản là singleton . Có một sự khác biệt nhỏ quý giá giữa singleton và global, đúng. Và vì điều đó, không có lý do gì để có một kết nối singleton: tại sao bạn lại dành thời gian thiết lập điều đó trong khi bạn có thể tạo một toàn cầu thông thường?
Những gì một nhà máy giúp bạn có được là lý do tại sao để có được kết nối và một vị trí riêng biệt để quyết định những kết nối (hoặc kết nối) nào bạn sẽ nhận được.
Thí dụ
class ConnectionFactory
{
private static $factory;
private $db;
public static function getFactory()
{
if (!self::$factory)
self::$factory = new ConnectionFactory(...);
return self::$factory;
}
public function getConnection() {
if (!$this->db)
$this->db = new PDO(...);
return $this->db;
}
}
function getSomething()
{
$conn = ConnectionFactory::getFactory()->getConnection();
.
.
.
}
Sau đó, trong 6 tháng khi ứng dụng của bạn trở nên cực kỳ nổi tiếng và nhận được nhiều sự chú ý và đánh giá cao và bạn quyết định rằng mình cần nhiều hơn một kết nối duy nhất, tất cả những gì bạn phải làm là triển khai một số tổng hợp trong phương thức getConnection (). Hoặc nếu bạn quyết định rằng bạn muốn một trình bao bọc thực hiện ghi nhật ký SQL, bạn có thể chuyển một lớp con PDO. Hoặc nếu bạn quyết định muốn có một kết nối mới trên mỗi lần gọi, bạn có thể làm điều đó. Nó linh hoạt, thay vì cứng nhắc.
16 dòng mã, bao gồm cả dấu ngoặc nhọn, sẽ giúp bạn tiết kiệm hàng giờ đồng hồ và hàng giờ để cấu trúc lại thành một thứ gì đó tương tự một cách kỳ lạ.
Lưu ý rằng tôi không coi đây là "Tính năng Creep" vì tôi không thực hiện bất kỳ triển khai tính năng nào trong vòng đầu tiên. Đó là đường biên giới "Future Creep", nhưng tại một số điểm, ý tưởng "viết mã cho ngày mai hôm nay" luôn là một điều tồi tệ đối với tôi.