>백엔드 개발 >C#.Net 튜토리얼 >C++ 디자인 패턴 플라이웨이트 패턴에 대한 간략한 소개

C++ 디자인 패턴 플라이웨이트 패턴에 대한 간략한 소개

黄舟
黄舟원래의
2017-01-17 13:27:001390검색

플라이웨이트: 공유 기술을 사용하여 수많은 세밀한 개체를 효과적으로 지원합니다.

네 가지 역할 클래스:

플라이급 플라이급 클래스: 모든 특정 플라이급 클래스의 슈퍼 클래스 또는 인터페이스입니다. 이 인터페이스를 통해 플라이급은 외부 상태를 받아들이고 이에 따라 조치를 취할 수 있습니다.

Flyweight Flyweight Factory 클래스: Flyweight를 생성하고 관리하는 데 사용되는 Flyweight 팩토리입니다. 사용자가 Flyweight를 요청하면 FlyweightFactory 개체가 생성된 인스턴스를 제공하거나 인스턴스를 생성합니다(존재하지 않는 경우).

ConcreteFlyweight 콘크리트 플라이웨이트 클래스: Flyweight 슈퍼 클래스를 상속하거나 Flyweight 인터페이스를 구현하고 내부 상태를 위한 저장 공간을 추가합니다.

UnSharedConcreteFlyweight는 공유할 필요가 없는 특정 Flyweight 하위 클래스, 즉 공유할 필요가 없는 Flyweight 하위 클래스를 나타냅니다. Flyweight 인터페이스 클래스 공유는 가능하지만 공유가 필수는 아니기 때문입니다.

패턴 구현:

[code]//享元类
class Flyweight{
public:
    virtual void Operation(int extrinsicState){}
};

//具体享元类
class ConcreteFlyweight: public Flyweight{
public:
    virtual void Operation(int extrinsicState)override{
        std::cout << "ConcreteFlyweight: " << extrinsicState << std::endl;
    }
};

//不需共享的Flyweight子类
class UnSharedConcreteFlyweight: public Flyweight{
public:
    virtual void Operation(int extrinsicState){
        std::cout << "UnSharedConcreteFlyweight: " << extrinsicState << std::endl;
    }
};

//享元工厂,用来创建并管理Flyweight对象
class FlyweightFactory{
private:
    std::map<std::string, Flyweight*> flyweights;
public:
    FlyweightFactory(){
        flyweights["X"] = new ConcreteFlyweight;
        flyweights["Y"] = new ConcreteFlyweight;
        flyweights["Z"] = new ConcreteFlyweight;
    }
    Flyweight* GetFlyweight(std::string key){
        return (Flyweight*)flyweights[key];
    }
};

클라이언트:

[code]//Client
int main(){
    //外部状态
    int extrinsicState = 22;
    //工厂
    FlyweightFactory *f = new FlyweightFactory;
    Flyweight* fx = f->GetFlyweight("X");
    fx->Operation(--extrinsicState);  //Output: ConcreteFlyweight: 21

    Flyweight* fy = f->GetFlyweight("Y");
    fy->Operation(--extrinsicState);  //Output: ConcreteFlyweight: 20

    Flyweight* fz = f->GetFlyweight("Z");
    fz->Operation(--extrinsicState);  //Output: ConcreteFlyweight: 19

    Flyweight *uf = new UnSharedConcreteFlyweight;  //Output: UnSharedConcreteFlyweight: 18
    uf->Operation(--extrinsicState);

    return 0;
}

플라이웨이트 패턴 이점:

애플리케이션이 많은 수의 객체를 사용하는 경우 대규모 스토리지 오버헤드를 생성하는 경우 객체를 고려해야 합니다.

객체의 대부분의 상태는 외부 상태를 사용할 수 있습니다. 객체의 외부 상태가 삭제되면 많은 객체 그룹이 상대적으로 적은 수의 공유 객체로 대체될 수 있습니다. 이 경우 플라이웨이트 패턴을 고려할 수 있습니다.

위 내용은 플라이웨이트 패턴에 대한 C++ 디자인 패턴 간략 소개 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.