>  기사  >  백엔드 개발  >  한 기사에서 PHP의 플라이급 패턴에 대해 알아보세요.

한 기사에서 PHP의 플라이급 패턴에 대해 알아보세요.

青灯夜游
青灯夜游앞으로
2021-07-14 19:32:552863검색

이전 기사 "PHP의 프록시 모드(정방향 프록시 및 역방향 프록시)에 대해 이야기"에서 PHP의 프록시 모드를 소개했습니다. 이 기사에서는 PHP 디자인 패턴의 플라이웨이트를 이해하도록 안내합니다.

한 기사에서 PHP의 플라이급 패턴에 대해 알아보세요.

플라잉 달러 모드, "플라잉 달러"라는 단어는 실제로 중국어로 특별한 의미가 없으므로 분해하여 살펴 봐야합니다. "Xiang"은 공유를 의미하고 "Yuan"은 특정 요소를 공유한다는 것을 이해하기 쉬운 것 같습니다.

Gof 클래스 다이어그램 및 설명

GoF 정의: 공유 기술을 사용하여 다수의 세분화된 개체를 효과적으로 지원

GoF 클래스 다이어그램

한 기사에서 PHP의 플라이급 패턴에 대해 알아보세요.

코드 구현

rrre 에

공유 인터페이스 및 그 구현을 정의합니다. 여기에는 두 가지 구현이 있습니다. ConcreteFlyweigh는 상태를 공유하고, UnsharedConcreteFlyweight는 공유하지 않거나 해당 상태를 공유할 필요가 없습니다.

interface Flyweight
{
    public function operation($extrinsicState) : void;
}

class ConcreteFlyweight implements Flyweight
{
    private $intrinsicState = 101;
    function operation($extrinsicState) : void
    {
        echo '共享享元对象' . ($extrinsicState + $this->intrinsicState) . PHP_EOL;
    }
}

class UnsharedConcreteFlyweight implements Flyweight
{
    private $allState = 1000;
    public function operation($extrinsicState) : void
    {
        echo '非共享享元对象:' . ($extrinsicState + $this->allState) . PHP_EOL;
    }
}

공유해야 하는 객체를 저장하고 공장으로 사용합니다. 필요한 공유 객체를 생성하여 동일한 키 값을 가진 고유한 객체만 있도록 하여 동일한 객체 생성 비용을 절약합니다

class FlyweightFactory
{
    private $flyweights = [];

    public function getFlyweight($key) : Flyweight
    {
        if (!array_key_exists($key, $this->flyweights)) {
            $this->flyweights[$key] = new ConcreteFlyweight();
        }
        return $this->flyweights[$key];
    }
}

클라이언트 호출을 통해 외부 상태 $extrinsicState를 각 객체 간에 공유할 수 있습니다

  • 좀 흥미롭네요. 이 모드는 코드의 양이 적지 않습니다
  • 응용 프로그램이 매우 유사한 개체를 많이 사용하고 개체의 상태 대부분이 외부 상태로 변경될 수 있는 경우 매우 적합합니다. Flyweight 패턴
  • 여기의 팩토리는 객체의 목록을 저장합니다. 객체는 팩토리 메소드나 추상 팩토리처럼 생성되지만 객체가 존재하면 직접 반환되며 실제로는 항상 목록이 유지됩니다. , 모든 사람이 어느 시점에서 플라이급 모델을 사용했을 것입니다. 스레드 풀, 연결 풀 등 다양한 풀 기술이 일반적인 응용 프로그램입니다. 다른 두 개의 동일한 문자열 문자열 유형은 PHP 또는 Java에도 적용됩니다. 플라이웨이트 모드는 연결되어 있습니다. 메모리 주소는 모두 동일합니다. 이것은 일종의 공유가 아닌가요? 플라이웨이트 모드에 관해서는 아래 예시보다 훨씬 나은 매우 고전적인 예시가 있습니다. 바둑판. Go에는 검정색과 흰색의 두 가지 색상만 있으므로 다음에는 두 가지 객체로 충분합니다. 위치 상태를 변경하면 됩니다! 관심있는 친구들은 검색해보세요!
  • Laravel의 IoC 컨테이너는 플라이웨이트 패턴의 구현으로 볼 수 있습니다. 객체를 배열에 저장하고 필요할 때 일부 상태 속성을 공유하는 일부 클래스도 있습니다. 코드를 보면 이해할 수 있습니다.
  • 기술은 변화하는 껍질에 기반을 두고 있다는 사실에 대해 이야기해 보겠습니다. 결국, 여전히 모든 사람들은 자신의 개성을 보여주기 위해 다양한 색상의 휴대폰을 좋아합니다. 앞서 말했듯이, 컬러별로 생산라인을 구축해야 한다면 엄청난 투자가 되지 않을까? 다행스럽게도 저희 공장(Xiangyuan Factory)에서는 각 모델별로 가장 기본적인 배경 쉘(오브젝트)만 생산하고 특수 인쇄 라인(상태 변경)을 통해 색상을 입힙니다! 글쎄, 다음 아이폰은 조만간 우리를 모방할 것입니다. 먼저 모든 종류의 금과 다양한 색상을 수집해야 할 것 같습니다. 어쩌면 용을 소환할 수도 있을 것 같습니다! !

전체 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights.php

Example

역시 우리는 여기에 있습니다. 문자 메시지, 이번에는 문자 메시지가 여전히 Alibaba Cloud 및 Jiguang SMS를 사용하여 전송되지만 이번에는 플라이웨이트 모드를 사용하여 이를 구현합니다. 플라이웨이트 팩토리에서는 내부 및 외부 상태를 통해 두 가지 유형의 객체를 저장합니다. 그것들이 끊임없이 변하도록 놔두세요!

SMS 전송 클래스 다이어그램

전체 소스 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights-message.php한 기사에서 PHP의 플라이급 패턴에 대해 알아보세요.

$factory = new FlyweightFactory();

$extrinsicState = 100;
$flA = $factory->getFlyweight('a');
$flA->operation(--$extrinsicState);

$flB = $factory->getFlyweight('b');
$flB->operation(--$extrinsicState);

$flC = $factory->getFlyweight('c');
$flC->operation(--$extrinsicState);

$flD = new UnsharedConcreteFlyweight();
$flD->operation(--$extrinsicState);

설명

코드가 좀 많지만 실제로는 2가지 종류의 클래스가 있고 4가지 종류의 객체가 생성됩니다. 각 클래스의 다양한 개체는 템플릿에 따라 구별됩니다. 이 조합은 매우 편리합니다. 다른 모드와 결합하여 공장을 최적화할 수 있습니다.

플라이웨이트 모드는 시스템에 유사한 객체가 많이 있고 버퍼 풀이 필요한 시나리오에 적합합니다. 메모리 사용량을 줄이고 효율성을 향상시킬 수 있지만 복잡성이 증가하고 내부 및 외부 상태를 공유해야 합니다. 주요 특징은 고유한 로고가 있다는 점으로, 해당 객체가 메모리에 이미 존재하는 경우 다시 생성하지 않고 해당 객체를 직접 반환합니다
  • 원본 주소 : https://juejin.cn/post/6844903965814259726
  • 저자 : 하드코어 프로젝트 매니저
  • 추천 학습: "PHP 비디오 튜토리얼"

위 내용은 한 기사에서 PHP의 플라이급 패턴에 대해 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제