11. 향원 모드(디자인 모드 노트)
장면
메모리는 희소한 자원에 속하니 함부로 낭비해서는 안 된다.만약 완전히 같거나 비슷한 대상이 많다면, 우리는 향원 모드를 통해 메모리를 절약할 수 있다
핵심
3. 실례: 바둑 소프트웨어 디자인
바둑돌마다 하나의 대상이 있는데 다음과 같은 속성이 있다. 색깔, 모양, 크기 등 세 가지 속성은 공유할 수 있지만 위치 속성은 공유할 수 없다.
4. 형원 모델의 실현
FlyWeightFactory
향원공장류: 향원대상을 창설하고 관리하며, 향원못은 일반적으로 키값 쌍으로 설계FlyWeight
추상적 향원류: 일반적으로 하나의 인터페이스나 추상류로 공공 방법을 성명한다. 이런 방법은 외부에 대상의 내부 상태를 제공하고 외부 상태를 설정할 수 있다ConcreteFlyWeight
세부 향원류: 내부 상태에 구성원 변수를 제공하여 저장UnsharedConcreteFlyWeight
비공유 향원류: 공유할 수 없는 하위 클래스는 비공유 향원류로 설계할 수 있다5. 실례: 바둑을 간단하게 실현 ChessFlyWeight.java
package cn.itcast.day242.flyWeight;
//
public interface ChessFlyWeight {
public void setColor(String color);//
public String getColor();//
public void display(Coordinate c);//
}
//
class ConcreteChess implements ChessFlyWeight {
private String color;//
public ConcreteChess(String color) {
this.color = color;
}
public void setColor(String color) {
this.color = color;
}
public String getColor() {
return color;
}
public void display(Coordinate c) {
System.out.println(" :" + color);
System.out.println(" :" + c.getX() + "," + c.getY());
}
}
Coordinate.java
package cn.itcast.day242.flyWeight;
// : UnsharedConcreteFlyWeight
public class Coordinate {
private int x;
private int y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
ChessFlyWeightFactory.java
package cn.itcast.day242.flyWeight;
import java.util.HashMap;
import java.util.Map;
//
public class ChessFlyWeightFactory {
//
private static Map map = new HashMap();
public static ChessFlyWeight getChess(String color) {
ChessFlyWeight c = map.get(color);
if (c != null) {
return c;
} else {
c = new ConcreteChess(color);
map.put(color, c);
return c;
}
}
}
Client.java
package cn.itcast.day242.flyWeight;
public class Client {
public static void main(String[] args) {
ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess(" ");
ChessFlyWeight chess2 = ChessFlyWeightFactory.getChess(" ");
System.out.println(chess1);
System.out.println(chess2);
System.out.println(" ");
chess1.display(new Coordinate(10, 10));
chess2.display(new Coordinate(20, 20));
}
}
설명: 위에서 사용한 방식과 같이 우리는 위의 두 종류가 사실은 같은 종류이고 내부 정보(색깔)는 공유되지만 외부 정보(좌표)는 독립적이라는 것을 알 수 있다.
장면
package cn.itcast.day242.flyWeight;
//
public interface ChessFlyWeight {
public void setColor(String color);//
public String getColor();//
public void display(Coordinate c);//
}
//
class ConcreteChess implements ChessFlyWeight {
private String color;//
public ConcreteChess(String color) {
this.color = color;
}
public void setColor(String color) {
this.color = color;
}
public String getColor() {
return color;
}
public void display(Coordinate c) {
System.out.println(" :" + color);
System.out.println(" :" + c.getX() + "," + c.getY());
}
}
package cn.itcast.day242.flyWeight;
// : UnsharedConcreteFlyWeight
public class Coordinate {
private int x;
private int y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
package cn.itcast.day242.flyWeight;
import java.util.HashMap;
import java.util.Map;
//
public class ChessFlyWeightFactory {
//
private static Map map = new HashMap();
public static ChessFlyWeight getChess(String color) {
ChessFlyWeight c = map.get(color);
if (c != null) {
return c;
} else {
c = new ConcreteChess(color);
map.put(color, c);
return c;
}
}
}
package cn.itcast.day242.flyWeight;
public class Client {
public static void main(String[] args) {
ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess(" ");
ChessFlyWeight chess2 = ChessFlyWeightFactory.getChess(" ");
System.out.println(chess1);
System.out.println(chess2);
System.out.println(" ");
chess1.display(new Coordinate(10, 10));
chess2.display(new Coordinate(20, 20));
}
}
String
류의 디자인도 향원 모델장점
결점
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.