이전 기사 "PHP의 템플릿 메소드 패턴 심층 분석"에서 PHP의 템플릿 메소드 패턴을 소개했습니다. 이 기사에서는 PHP 디자인 패턴의 싱글톤 패턴을 이해하는 데 도움이 될 것입니다.
싱글턴 패턴은 일반적으로 사용되고 자주 묻는 인터뷰 디자인 패턴 중 확실히 1위를 차지합니다. 한편으로는 매우 간단하며 몇 단어로 설명할 수 있습니다. 반면에 구현이 하나의 형식일 뿐만 아니라 Java와 같은 비동기 언어의 다중 스레드 잠금 문제도 고려해야 할 정도로 복잡합니다. 그러니 인터뷰할 때 면접관이 싱글톤 모델에 대해 질문할 때 긴장을 풀 것이라고 생각하지 마세요. 이 모델은 실제로 깊을 수도 있고 얕을 수도 있고, 개발자의 수준을 극도로 반영할 수도 있습니다. 일정 기간 동안 작업을 하다 보면 필연적으로 이 모델을 접하게 되기 때문입니다.
GoF 정의: 클래스에 인스턴스가 하나만 있는지 확인하고 이에 액세스할 수 있는 전역 액세스 포인트를 제공합니다.
GoF 클래스 다이어그램
코드 구현
class Singleton { private static $uniqueInstance; private $singletonData = '单例类内部数据'; private function __construct() { // 构造方法私有化,外部不能直接实例化这个类 } public static function GetInstance() { if (self::$uniqueInstance == null) { self::$uniqueInstance = new Singleton(); } return self::$uniqueInstance; } public function SingletonOperation(){ $this->singletonData = '修改单例类内部数据'; } public function GetSigletonData() { return $this->singletonData; } }
예, 핵심은 싱글톤 클래스일 뿐 다른 것이 아닙니다. 인스턴스화 후에 정적 변수가 자체적으로 저장되도록 합니다. 이 개체가 필요한 경우 GetInstance() 메서드를 호출하여 전역적으로 고유한 개체를 얻습니다. 클라이언트 측에서
$singletonA = Singleton::GetInstance(); echo $singletonA->GetSigletonData(), PHP_EOL; $singletonB = Singleton::GetInstance(); if ($singletonA === $singletonB) { echo '相同的对象', PHP_EOL; } $singletonA->SingletonOperation(); // 这里修改的是A echo $singletonB->GetSigletonData(), PHP_EOL;
를 호출하면 singletonB가 정확히 동일한 개체라는 것을 알 수 있습니다.
회사는 점점 커지고 있지만 OA 시스템에는 모든 회사 명단의 사본(싱글톤 클래스)이 하나만 저장되어 있습니다. 제가 두려운 점은 각 부서마다 고유한 명단이 있으면 혼란이 발생할 것이라는 점입니다. 예를 들어 업데이트가 시기적절하지 않으면 다른 부서에서 새로 입사하거나 퇴사한 직원이 누락될 수 있습니다. 다른 부서는 필요할 때 전체 명단을 보거나 전체 명단을 기반으로 자신의 부서 섹션을 만들고 수정할 수 있습니다. 하지만 OA 시스템에서 실제로 수정하는 것은 일반 명단의 내용입니다. 모두가 유지하는 것은 실제로 OA 시스템 서버에 저장된 유일한 실제 명단입니다
전체 코드 : https://github.com/zhangyue0503/ designpatterns-php/blob/master/21.singleton/source/singleton.php
위에서 말한 이후로 저는 데이터베이스 작업 클래스와 네트워크 요청 클래스를 모두 좋아하므로 싱글톤 모드를 사용하겠습니다. HTTP 요청 클래스의 싱글톤 모드 개발을 구현합니다. 오래 전 Android 작업을 할 때는 지금처럼 프레임워크가 많지 않았는데, Http 요청이 모두 자체적으로 캡슐화되어 있었고 대부분의 온라인 튜토리얼이 싱글톤 모드를 채택했던 것으로 기억합니다.
캐시 클래스 다이어그램
전체 소스 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton-http.php
<?php class HttpService{ private static $instance; public function GetInstance(){ if(self::$instance == NULL){ self::$instance = new HttpService(); } return self::$instance; } public function Post(){ echo '发送Post请求', PHP_EOL; } public function Get(){ echo '发送Get请求', PHP_EOL; } } $httpA = new HttpService(); $httpA->Post(); $httpA->Get(); $httpB = new HttpService(); $httpB->Post(); $httpB->Get(); var_dump($httpA == $httpB);
지침
Java와 같은 정적 언어에서 정적 변수는 직접적으로 새로운 객체가 될 수 있습니다. 선언
instance = new HttpService();. 이렇게 하면 GetInstance() 메서드를 생략할 수 있지만 이 정적 변수는 사용 여부에 관계없이 직접 인스턴스화되어 메모리를 차지하게 됩니다. 이런 종류의 싱글톤을 Hungry Chinese 싱글톤 패턴이라고 합니다.
원본 주소: https://juejin.cn/post/6844903990585458702
저자: Hardcore Project Manager
추천 학습: "PHP 비디오 튜토리얼"
위 내용은 PHP의 싱글턴 패턴에 대해 이야기해 봅시다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!