Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 알고리즘
- Exception
- Thymeleaf
- 스프링 핵심 원리
- AOP
- Proxy
- Android
- transaction
- 백준
- db
- JDBC
- jpa
- 인프런
- springdatajpa
- 스프링
- kotlin
- SpringBoot
- 자바
- http
- QueryDSL
- 김영한
- spring
- 스프링 핵심 기능
- Spring Boot
- 그리디
- Greedy
- java
- pointcut
- JPQL
- Servlet
Archives
- Today
- Total
개발자되기 프로젝트
낭비를 없애기 - Flyweight Pattern 본문
1. Flyweight Pattern ??
- 공유할 수 있는 객체는 공유하여 사용한다.
- 규모가 작고, 인스턴스 마다 특성이 따로 없다면 공유해서 사용할 수 있다.
2. 의도와 동기
- 각 단어를 각각 표현하기보다는 문자를 공유하여 표현하면 비용이 훨씬적게 소요됨
- 각 객체가 부가적인 상태 (글꼴등...)이 있다면 따로 관리해야 하는 경우가 있음
- 작은 여러개의 객체를 관리해야 할때 주로 사용
3. Class diagram
4. 객체 협력 (collaborations)
- Flyweight
각 객체가 사용할 인터페이스를 정의한다.
- CocreteFlyweight
공유될 수 있는 실제적 객체를 구현
- UnSharedCocreteFlyweight
각 인스턴스마다 가지게 되는 부가적인 특성이 있다면 구현한다.
- FlyweightFactory
Flyweight에 pool을 관리한다. 각 Flyweight 객체는 Singleton으로 생성한다.
5. 중요한 결론 (consequence)
- 공유를 통하여 인스턴스의 수를 절약한다.
- 인스턴스마다의 특성이 거의 없는 객체에 사용하는 것이 효율적이다.
- 부가적인 정보가 많은 경우는 비효율적일 수 있다.
6. 예제
- 문자열을 입력했을 때, 각 문자에 해당하는 파일이 있는경우 파일의 값을 불러온다.
- 만약 엎으면 문자 + ?? 을 출력한다.
- 각 파일은 다음과 같이 생성한다.
- big1.txt
----##----
----##----
----##----
----##----
----##----
----##----
----##----
- big2.txt
##########
--------##
--------##
##########
##--------
##--------
##########
- big3.txt
##########
--------##
--------##
--########
--------##
--------##
##########
- 따라서 123abc123과 같은 String이 주어지면 아래와 같이 차례대로 출력되는 코드를 작성해 보자.
- 즉 문자 마다 해당되는 파일의 인스턴스를 공유한다!
----##----
----##----
----##----
----##----
----##----
----##----
----##----
##########
--------##
--------##
##########
##--------
##--------
##########
##########
--------##
--------##
--########
--------##
--------##
##########
a??
b??
c??
----##----
----##----
----##----
----##----
----##----
----##----
----##----
##########
--------##
--------##
##########
##--------
##--------
##########
##########
--------##
--------##
--########
--------##
--------##
##########
- 주어진 문자에 해당하는 파일은 읽어서 인스턴스를 생성.
- 예를들어 "1"이 주어지면 big1.txt의 값을 읽어와서 해당 파일의 값을 보관.
public class BigChar {
private char charName;
private String fontData;
public BigChar(char charName) {
this.charName = charName;
try {
//bigxx.txt파일의 data 가져옴.
BufferedReader bufferedReader = new BufferedReader(new FileReader("big" + charName + ".txt"));
String line;
StringBuffer buf = new StringBuffer();
while ((line = bufferedReader.readLine()) != null){
buf.append(line);
buf.append("\n");
}
bufferedReader.close();
//fontData에 파일에서 읽은 값 보관.
this.fontData = buf.toString();
} catch (IOException e) {
this.fontData = charName + "??";
}
}
//출력
public void print(){
System.out.println(fontData);
}
}
- BigChar 객체를 생성하기 위한 Factory
- 주어진 문자 & BigChar 객체(파일 data 가지고 있음)를 key&value로 pool에서 관리함.
- factory는 singleton
- getBigChar에 synchronized사용 이유; pool은 공용 resource임. 따라서 해당 메서드를 통해 pool에 접근하는 경우 다른 thread에서 resource에 접근하지 못하도록 resource를 lock.
- getBigChar()를 통해 이미 인스턴스가 있으면 해당 인스턴스를 가져오고 없으면 생성한다.
public class BigCharFactory {
private HashMap<String, BigChar> pool = new HashMap<>();
private static BigCharFactory singleton = new BigCharFactory();
private BigCharFactory() {
}
public static BigCharFactory getInstance(){
return singleton;
}
public synchronized BigChar getBigChar(char charName){
BigChar bc = pool.get(""+ charName);
if (bc == null){
bc = new BigChar(charName);
pool.put(""+charName, bc); //char를 String으로 바꾸기 위해 "" 추가함.
}
return bc;
}
}
- 주어진 문자를 BigChar의 배열로 관리하는 BigString class
- BigString생성 시 String을 주입받고 해당 String을 가지고 factory를 통해 BigChar 배열을 생성.
public class BigString {
private BigChar[] bigChars;
public BigString(String string) {
bigChars = new BigChar[string.length()];
BigCharFactory factory = BigCharFactory.getInstance();
for (int i=0; i<bigChars.length; i++){
bigChars[i] = factory.getBigChar(string.charAt(i));
}
}
public void print(){
for (int i=0; i<bigChars.length; i++){
bigChars[i].print();
}
}
}
- Test
public class Main {
public static void main(String[] args) {
BigString bs = new BigString("123abc123");
bs.print();
}
}
- 결과
----##----
----##----
----##----
----##----
----##----
----##----
----##----
##########
--------##
--------##
##########
##--------
##--------
##########
##########
--------##
--------##
--########
--------##
--------##
##########
a??
b??
c??
----##----
----##----
----##----
----##----
----##----
----##----
----##----
##########
--------##
--------##
##########
##--------
##--------
##########
##########
--------##
--------##
--########
--------##
--------##
##########
7. GitHub : 211115 flyweight Pattern
'Java > 디자인 패턴' 카테고리의 다른 글
명령 - Command Pattern (0) | 2021.11.15 |
---|---|
낭비를 없애기 - Proxy Pattern (0) | 2021.11.15 |
구조 안을 돌아다니며 처리 - Chain of Responsibility (0) | 2021.11.15 |
구조 안을 돌아다니며 처리 - Visitor (0) | 2021.11.13 |
구조안을 돌아다니며 처리 - Iterator Pattern (0) | 2021.11.13 |
Comments