Java 디자인 모드의 향원 모드 실례 설명

4655 단어
본고의 실례는 자바 디자인 모델의 향원 모델을 설명했다.여러분에게 참고하도록 공유하겠습니다. 구체적으로는 다음과 같습니다.
개념을 설명하자면 한 시스템에 같은 대상이 여러 개 있다면 한 부만 공유하면 되고 한 개씩 하나의 대상을 실례화할 필요가 없다.예를 들어 하나의 텍스트 시스템에서 알파벳마다 하나의 대상을 정하면 대소문자가 모두 52개라면 52개의 대상을 정의해야 한다.만약 1M의 텍스트가 있다면 알파벳이 얼마나 많은지, 모든 알파벳이 하나의 대상을 정의한다면 메모리는 이미 폭발했을 것이다.그러면 자모마다 대상을 공유하면 자원을 크게 절약할 수 있다.
Flyweight 모드에서는 다양한 대상이 생겨야 하기 때문에 Flyweight 모드에서 팩토리 모드가 자주 나타난다.Flyweight의 내부 상태는 공유하는 데 사용되며, Flyweight factory는 내부 상태의 대상을 저장하기 위해 대상 저장소(Flyweight Pool)를 유지한다.Flyweight 모드는 프로그램의 효율과 성능을 향상시키는 모드로 프로그램의 운행 속도를 크게 가속화시킬 수 있다.응용 장소가 매우 많은데 다음과 같은 예를 들자.
먼저 추상적인 Flyweight 클래스를 정의합니다.

package Flyweight;
public abstract class Flyweight{
public abstract void operation();
}


특정 클래스 구현:

package Flyweight;
public class ConcreteFlyweight extends Flyweight{
private String string;
public ConcreteFlyweight(String str){
string = str;
}
public void operation()
{
System.out.println("Concrete---Flyweight : " + string);
}
}


하나의 플랜트 방법론을 구현합니다.

package Flyweight;
import java.util.Hashtable;
public class FlyweightFactory{
private Hashtable flyweights = new Hashtable();//----------------------------1
public FlyweightFactory(){}
public Flyweight getFlyWeight(Object obj){
Flyweight flyweight = (Flyweight) flyweights.get(obj);//----------------2
if(flyweight == null){//---------------------------------------------------3
// ConcreteFlyweight
flyweight = new ConcreteFlyweight((String)obj);
flyweights.put(obj, flyweight);//--------------------------------------5
}
return flyweight;//---------------------------------------------------------6
}
public int getFlyweightSize(){
return flyweights.size();
}
}


이 공장 방법의 종류는 매우 관건적이다. 여기서 상세하게 설명한다.
각 대상을 저장하기 위해hashtable을 1곳에 정의했습니다.실례화할 대상을 2곳에서 선택하고 6곳에서 이 대상을 되돌려줍니다.Hashtable에서 선택할 대상이 없으면 변수flyweight는null입니다. 새로운flyweight를Hashtable에 저장하고 그 대상을 되돌려줍니다.
마지막으로 Flyweight 호출 보기:

package Flyweight;
import java.util.Hashtable;
public class FlyweightPattern{
FlyweightFactory factory = new FlyweightFactory();
Flyweight fly1;
Flyweight fly2;
Flyweight fly3;
Flyweight fly4;
Flyweight fly5;
Flyweight fly6;
/** *//** Creates a new instance of FlyweightPattern */
public FlyweightPattern(){
fly1 = factory.getFlyWeight("Google");
fly2 = factory.getFlyWeight("Qutr");
fly3 = factory.getFlyWeight("Google");
fly4 = factory.getFlyWeight("Google");
fly5 = factory.getFlyWeight("Google");
fly6 = factory.getFlyWeight("Google");
}
public void showFlyweight(){
fly1.operation();
fly2.operation();
fly3.operation();
fly4.operation();
fly5.operation();
fly6.operation();
int objSize = factory.getFlyweightSize();
System.out.println("objSize = " + objSize);
}
public static void main(String[] args){
System.out.println("The FlyWeight Pattern!");
FlyweightPattern fp = new FlyweightPattern();
fp.showFlyweight();
}
}


다음은 실행 결과입니다.
Concrete---Flyweight : Google Concrete---Flyweight : Qutr Concrete---Flyweight : Google Concrete---Flyweight : Google Concrete---Flyweight : Google Concrete---Flyweight : Google objSize = 2
우리는 6개의 대상을 정의했는데, 그 중 5개가 똑같았다. Flyweight 모드의 정의에 따르면 Google은 하나의 대상을 공유해야 하는데, 실제 대상 수에서 실제 대상은 2개에 불과하다는 것을 알 수 있다.
요약:
Flyweight 모드는 복잡한 시스템에서 메모리 공간을 많이 절약할 수 있도록 도와주기 때문에 매우 중요하다.JAVA 언어에서 스트링 유형은 바로 누리 모드를 사용했다.String 대상은final 형식입니다. 대상이 만들어지면 변경할 수 없습니다.JAVA에서 문자열 상수는 상수 풀에 존재합니다. JAVA는 문자열 상수가 상수 풀에 복사본만 있는 것을 보장합니다.String a = "abc"에서 "abc"는 문자열의 상수입니다.
자바에 익숙한 사람은 다음과 같은 예를 알아야 한다.

String a = "hello";
String b = "hello";
if(a == b)
System.out.println("OK");
else
System.out.println("Error");


출력 결과: OK.if 조건을 비교한 것은 2a와 b의 주소이고 메모리 공간이라고 할 수 있다
핵심적으로 정리하면 공유할 수 있는 대상, 즉 되돌아오는 같은 유형의 대상은 사실상 같은 실례이다. 클라이언트가 하나의 대상을 생성하라고 요구할 때 공장은 이 대상의 실례가 존재하는지 검사한다. 만약에 존재한다면 직접 이 대상의 실례로 돌아가고 존재하지 않으면 하나를 만들고 저장한다. 이 점은 일부 사례 모델의 뜻이다.보통 공장 클래스는 hashtable,vector 등 대상을 저장하기 위해 집합 형식의 구성원 변수를 사용합니다.자바에서 데이터베이스 연결 탱크, 스레드 탱크 등은 바로 향원 모델로 응용된다.
더 많은 자바 관련 내용에 관심이 있는 독자들은 본 사이트의 주제를 볼 수 있다.,,,,,
본고에서 서술한 바가 모두의 자바 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기