이 글은 싱글턴 모드, 팩토리 모드, 등록 트리 모드, 전략 모드, 어댑터 모드, 관찰 등 6가지 주요 디자인 패턴과 관련된 이슈를 주로 소개하는 PHP에 대한 관련 지식을 제공합니다. 아래의 사용자 모드가 모든 사람에게 도움이 되기를 바랍니다.
추천 학습: "PHP 비디오 튜토리얼"
3개의 프라이빗과 한 개의 퍼블릭: 프라이빗 정적 변수(인스턴스 저장), 프라이빗 생성 방법( 인스턴스 생성 방지), 프라이빗 복제 방법(객체 복제 방지), 공용 정적 메소드(외부에 인스턴스 제공)
프로그램 응용 프로그램에서 데이터베이스 작업이 포함될 때, 모든 작업 연결 데이터베이스에 많은 리소스를 소비하게 됩니다. 싱글톤 모드를 통해 고유한 데이터베이스 연결 개체를 생성할 수 있습니다.
<?phpclass Singleton{ private static $_instance; private function __construct(){} private function __clone(){} public static function getInstance() { if(self::$_instance instanceof Singleton){//instanceof 判断一个实例是否是某个类的对象 self::$_instance = new Singleton(); } return self::$_instance; }}
생성된 객체에서 호출 객체를 분리하고 호출자가 직접 팩토리를 요청하여 코드 결합을 줄이고 시스템의 유지 관리성과 확장성을 향상시킵니다.
객체를 생성하는 특정 메서드가 포함된 클래스를 제공하면 new를 직접 사용하지 않고도 팩토리 클래스를 사용하여 객체를 생성할 수 있습니다. 이렇게 하면 생성된 객체의 유형을 변경하려는 경우 팩토리만 변경하면 됩니다.
//假设3个待实例化的类class Aclass{}class Bclass{}class Cclass{}class Factory{ //定义每个类的类名 const ACLASS = 'Aclass'; const BCLASS = 'Bclass'; const CCLASS = 'Cclass'; public static function getInstance($newclass) { $class = $newclass;//真实项目中这里常常是用来解析路由,加载文件。 return new $class; }}//调用方法:Factory::getInstance(Factory::ACLASS);
등록 트리 패턴은 객체 인스턴스를 전역 객체 트리에 등록하고 필요할 때 객체 트리에서 선택하는 패턴 설계 방법입니다.
싱글톤 모드, 팩토리 모드 또는 둘의 조합을 통해 개체를 생성하더라도 해당 개체는 모두 등록 트리에 "삽입"됩니다. 개체를 사용할 때 등록 트리에서 직접 가져옵니다. 이는 전역 변수를 사용하는 것만큼 편리하고 실용적입니다. 그리고 등록 트리 패턴은 다른 패턴에 대한 아주 좋은 아이디어도 제공합니다. (다음 예는 싱글톤, 팩토리, 등록 트리를 결합하여 사용하는 것입니다.)
//创建单例class Single{ public $hash; static protected $ins=null; final protected function __construct(){ $this->hash=rand(1,9999); } static public function getInstance(){ if (self::$ins instanceof self) { return self::$ins; } self::$ins=new self(); return self::$ins; }}//工厂模式class RandFactory{ public static function factory(){ return Single::getInstance(); }}//注册树class Register{ protected static $objects; public static function set($alias,$object){ self::$objects[$alias]=$object; } public static function get($alias){ return self::$objects[$alias]; } public static function _unset($alias){ unset(self::$objects[$alias]); }}//调用Register::set('rand',RandFactory::factory());$object=Register::get('rand');print_r($object);
일련의 알고리즘을 정의하고, 각 알고리즘을 캡슐화하고, 상호 교환 가능하게 만듭니다. 전략 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있습니다.
전략 패턴은 관련 알고리즘 계열을 관리하는 방법을 제공합니다. 전략 패턴은 상속 관계를 대체하는 방법을 제공합니다. 전략 패턴을 사용하면 여러 조건부 전송 문을 사용하지 않아도 됩니다.
여러 클래스는 서로 다른 동작으로만 구별됩니다. 전략 모드를 사용하면 런타임에 실행할 특정 동작을 동적으로 선택할 수 있습니다. 예를 들어, 학교에 가는 방법에는 걷기, 버스, 지하철 등 다양한 전략이 있습니다...
abstract class Strategy{ abstract function goSchool();}class Run extends Strategy{ public function goSchool() { // TODO: Implement goSchool() method. }}class Subway extends Strategy{ public function goSchool() { // TODO: Implement goSchool() method. }}class Bike extends Strategy{ public function goSchool() { // TODO: Implement goSchool() method. }}class Context{ protected $_stratege;//存储传过来的策略对象 public function goSchoole() { $this->_stratege->goSchoole(); }}//调用:$contenx = new Context();$avil_stratery = new Subway();$contenx->goSchoole($avil_stratery);
완전히 다른 다양한 기능 인터페이스를 통합 API로 캡슐화합니다.
PHP에는 MySQL, MySQLi 및 PDO의 세 가지 데이터베이스 작업이 있습니다. 이는 어댑터 모드를 사용하여 서로 다른 데이터베이스 작업을 동일한 API로 통합할 수 있습니다. 유사한 시나리오에는 Memcache, Redis, 파일, APC 등과 같은 다양한 캐시 기능을 일관된 기능으로 통합할 수 있는 캐시 어댑터가 포함됩니다.
abstract class Toy{ public abstract function openMouth(); public abstract function closeMouth();}class Dog extends Toy{ public function openMouth() { echo "Dog open Mouth\n"; } public function closeMouth() { echo "Dog close Mouth\n"; }}class Cat extends Toy{ public function openMouth() { echo "Cat open Mouth\n"; } public function closeMouth() { echo "Cat close Mouth\n"; }}//目标角色(红)interface RedTarget{ public function doMouthOpen(); public function doMouthClose();}//目标角色(绿)interface GreenTarget{ public function operateMouth($type = 0);}//类适配器角色(红)class RedAdapter implements RedTarget{ private $adaptee; function __construct(Toy $adaptee) { $this->adaptee = $adaptee; } //委派调用Adaptee的sampleMethod1方法 public function doMouthOpen() { $this->adaptee->openMouth(); } public function doMouthClose() { $this->adaptee->closeMouth(); }}//类适配器角色(绿)class GreenAdapter implements GreenTarget{ private $adaptee; function __construct(Toy $adaptee) { $this->adaptee = $adaptee; } //委派调用Adaptee:GreenTarget的operateMouth方法 public function operateMouth($type = 0) { if ($type) { $this->adaptee->openMouth(); } else { $this->adaptee->closeMouth(); } }}class testDriver{ public function run() { //实例化一只狗玩具 $adaptee_dog = new Dog(); echo "给狗套上红枣适配器\n"; $adapter_red = new RedAdapter($adaptee_dog); //张嘴 $adapter_red->doMouthOpen(); //闭嘴 $adapter_red->doMouthClose(); echo "给狗套上绿枣适配器\n"; $adapter_green = new GreenAdapter($adaptee_dog); //张嘴 $adapter_green->operateMouth(1); //闭嘴 $adapter_green->operateMouth(0); }}//调用$test = new testDriver();$test->run();
Observer 패턴(Observer)은 객체의 상태가 변경되면 이에 의존하는 모든 객체가 알림을 받고 자동으로 업데이트됩니다. 관찰자 패턴은 낮은 결합, 비침해적 알림 및 업데이트 메커니즘을 구현합니다.
이벤트가 발생한 후 일련의 업데이트 작업을 수행해야 합니다. 전통적인 프로그래밍 방법은 이벤트 코드 바로 뒤에 처리 로직을 추가하는 것입니다. 업데이트된 로직이 증가하면 코드 유지 관리가 어려워집니다. 이 방법은 결합되어 있으며 방해가 되므로 새 논리를 추가하려면 이벤트의 기본 코드를 수정해야 합니다.
// 主题接口interface Subject{ public function register(Observer $observer); public function notify();}// 观察者接口interface Observer{ public function watch();}// 主题class Action implements Subject{ public $_observers=[]; public function register(Observer $observer){ $this->_observers[]=$observer; } public function notify(){ foreach ($this->_observers as $observer) { $observer->watch(); } }}// 观察者class Cat1 implements Observer{ public function watch(){ echo "Cat1 watches TV<hr/>"; }} class Dog1 implements Observer{ public function watch(){ echo "Dog1 watches TV<hr/>"; } } class People implements Observer{ public function watch(){ echo "People watches TV<hr/>"; } }// 调用实例$action=new Action();$action->register(new Cat1());$action->register(new People());$action->register(new Dog1());$action->notify();
추천 학습: "PHP 비디오 튜토리얼"
위 내용은 PHP에서 일반적으로 사용되는 6가지 디자인 패턴(요약 공유)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!