C\#디자인 모드 프로 그래 밍 에서 메타 모드 의 활용 을 설명 합 니 다.
소프트웨어 개발 에서 우 리 는 때때로 대량의 입자 도 대상 을 만들어 야 한다.예 를 들 어 문서 처리 시스템 은 수천 개의 문자 대상 을 만들어 야 할 수도 있다.그러나 모든 문자 대상 에 게 메모 리 를 분배 하면 시스템 이 실 행 될 때 많은 메모 리 를 소모 할 것 이다.어떻게 대상 을 대상 으로 하 는 조작 방식 의 장점 을 보류 하 는 동시에 대량의 대상 을 만 드 는 것 을 피 합 니까?이제 향 원 모델 이 역할 을 발휘 할 때 다.
2.향원 모드
향 원 모델 은 공유 기술 을 활용 하여 대량의 입자 도 대상 을 효과적으로 지원 한다.예 를 들 어 문서 처리 시스템 에 공유 탱크 를 만 들 고 공유 탱크 에서 알파벳 과 코드 의 대응 관 계 를 구축 하면 공유 탱크 의 26 개 대상 으로 대량의 대상 을 만들어 야 하 는 문 제 를 해결 할 수 있다.그 구조 도 는 다음 과 같다.
Flyweight 는 향 원 인 터 페 이 스 를 정의 하고 외부 대상 은 이 인 터 페 이 스 를 통 해 구체 적 인 향 원 대상 에 접근 합 니 다.
ConcreteFlyweight 는 Flyweight 인 터 페 이 스 를 실현 하여 구체 적 인 향 원 대상 을 정의 하고 향 원 대상 의 내부 상 태 를 저장 합 니 다.이 향원 대상 은 공유 할 수 있다.
Unshared Concrete Flyweight 는 Flyweight 인 터 페 이 스 를 실현 하여 공유 에 사용 되 지 않 는 메타 대상 을 정의 합 니 다.
FlyweightFactory 에서 메타 대상 을 만 들 고 관리 합 니 다.
Client 는 향 원 인터페이스 에 대한 인용 을 저장 하고 이 인용 을 통 해 구체 적 인 향 원 대상 을 효과적으로 사용 합 니 다.
예시
다음은 하나의 실제 응용 으로 하 향 원 모델 을 실현 한다.이 예 는 하나의 텍스트 편집기 에 많은 글자 가 나타 나 고 향 원 모드 를 사용 하여 이 텍스트 편집 기 를 실현 하면 모든 글 자 를 향 원 대상 으로 만 듭 니 다.향 원 대상 의 내부 상 태 는 바로 이 글자 이 고 알파벳 이 텍스트 에 있 는 위치 와 글꼴 스타일 등 다른 정 보 는 외부 상태 입 니 다.다음은 이 예 를 들 어 하 향 원 모델 을 실현 하고 구체 적 인 실현 코드 는 다음 과 같다.
/// <summary>
///
/// </summary>
class Client
{
static void Main(string[] args)
{
// ,
int externalstate = 10;
//
FlyweightFactory factory = new FlyweightFactory();
// A, A
Flyweight fa = factory.GetFlyweight("A");
if (fa != null)
{
//
fa.Operation(--externalstate);
}
// B
Flyweight fb = factory.GetFlyweight("B");
if (fb != null)
{
fb.Operation(--externalstate);
}
// C
Flyweight fc = factory.GetFlyweight("C");
if (fc != null)
{
fc.Operation(--externalstate);
}
// D
Flyweight fd= factory.GetFlyweight("D");
if (fd != null)
{
fd.Operation(--externalstate);
}
else
{
Console.WriteLine(" D");
//
ConcreteFlyweight d = new ConcreteFlyweight("D");
factory.flyweights.Add("D", d);
}
Console.Read();
}
}
/// <summary>
/// ,
/// </summary>
public class FlyweightFactory
{
// Dictionary<string,Flyweighy>
//public Dictionary<string, Flyweight> flyweights = new Dictionary<string, Flyweight>();
public Hashtable flyweights = new Hashtable();
public FlyweightFactory()
{
flyweights.Add("A", new ConcreteFlyweight("A"));
flyweights.Add("B", new ConcreteFlyweight("B"));
flyweights.Add("C", new ConcreteFlyweight("C"));
}
public Flyweight GetFlyweight(string key)
{
//
//Flyweight flyweight = flyweights[key] as Flyweight;
//if (flyweight == null)
//{
// Console.WriteLine(" " + key);
// flyweight = new ConcreteFlyweight(key);
//}
//return flyweight;
return flyweights[key] as Flyweight;
}
}
/// <summary>
/// ,
/// </summary>
public abstract class Flyweight
{
public abstract void Operation(int extrinsicstate);
}
// , ,
public class ConcreteFlyweight : Flyweight
{
//
private string intrinsicstate ;
//
public ConcreteFlyweight(string innerState)
{
this.intrinsicstate = innerState;
}
/// <summary>
///
/// </summary>
/// <param name="extrinsicstate"> </param>
public override void Operation(int extrinsicstate)
{
Console.WriteLine(" : intrinsicstate {0}, extrinsicstate {1}", intrinsicstate, extrinsicstate);
}
}
향 원 모델 의 실현 에서 우 리 는 이전 처럼 입자 의 인 스 턴 스 를 하나의 단독 클래스 로 설계 하지 않 고 공유 대상 의 내부 상 태 를 공유 류 의 내부 정의 에 두 었 다.4.향 원 모델 의 장단 점
향 원 모델 의 실현 을 분석 한 후에 우 리 는 향 원 모델 의 장단 점 을 계속 분석 합 시다.
장점:
시스템 의 대상 수 를 낮 추어 시스템 의 입자 도 대상 이 메모리 에 가 져 오 는 압력 을 낮 추 었 다.
단점:
1.대상 이 공유 할 수 있 도록 일부 상 태 를 외부 화 시 켜 프로그램의 논 리 를 더욱 복잡 하 게 하고 시스템 을 복잡 하 게 해 야 한다.
2.향 원 모드 는 향 원 대상 의 상 태 를 외부 화하 고 외부 상 태 를 읽 으 면 운행 시간 이 약간 길 어 집 니 다.
5.장면 사용
아래 의 모든 조건 이 만족 할 때 향 원 모드 를 사용 하 는 것 을 고려 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.