플라이웨이트: 공유 기술을 사용하여 수많은 세밀한 개체를 효과적으로 지원합니다.
네 가지 역할 클래스:
플라이급 플라이급 클래스: 모든 특정 플라이급 클래스의 슈퍼 클래스 또는 인터페이스입니다. 이 인터페이스를 통해 플라이급은 외부 상태를 받아들이고 이에 따라 조치를 취할 수 있습니다.
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)를 참고해주세요!