Flyweight 享元模式

 

 

注:享元模式是结构型设计模式,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类).

 

很多细粒度对象,只用部分状态不同,大部分是相同的。为了减少内存开销,我们可以利用享元模式,通过一个对象来代替多个对象,实现需求。

 

享元模式中有个很经典的例子,字母的享元使用。

 

Java简单代码实现

字母类

 

package com.pattern.structure.flyweight;

 

public class Letter {

 

private String color ;

 

private String name ;

 

public String getColor() {

return color;

}

 

public void setColor(String color) {

this.color = color;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public void display() {

System.out.println(color + "  " + name);

}

}

 

 

 

字母工厂类

 

package com.pattern.structure.flyweight;

 

import java.util.HashMap;

import java.util.Map;

 

 

public class LetterFactory {

 

private static Map<String, Letter> letterMap = new HashMap<>() ;

 

public static Letter getRedLetter(String letterName) {

 

Letter letter = getLetter(letterName) ;

letter.setColor("red");

 

return letter ;

}

 

public static Letter getBlackLetter(String letterName) {

 

Letter letter = getLetter(letterName) ;

letter.setColor("black");

 

return letter ;

}

 

public static Letter getLetter(String letterName) {

 

Letter letter = null ;

if(letterMap.containsKey(letterName) ) {

letter = letterMap.get(letterName) ;

} else {

letter = new Letter() ;

letter.setName(letterName); 

letterMap.put(letterName, letter) ;

}

 

return letter ;

}

 

public static int getObjectSize() {

 

return letterMap.size() ;

}

}

 

 

 

客户端类

 

package com.pattern.structure.flyweight;

 

public class Client {

 

 

public static void main(String[] args) {

 

Letter aRed = LetterFactory.getRedLetter("a") ;

aRed.display(); 

 

Letter bRed = LetterFactory.getRedLetter("b") ;

bRed.display(); 

 

Letter aBlack = LetterFactory.getBlackLetter("a") ;

aBlack.display(); 

 

Letter bBlack = LetterFactory.getBlackLetter("b") ;

bBlack.display(); 

 

System.out.println("object size: " + LetterFactory.getObjectSize());

}

}

 

 

 

运行客户端程序可以看出,我们使用了4个对象,实际只创建了两个对象,如果颜色多种,效果更明显。

 

 

享元模式通用类图

 

 

 

 

 

------

  文章只为技术交流学习,若所写有误,请斧正,评论或消息与我,为不误导后来学习的人;若有不小心所写侵权,请告知我;若转载,请注明出处。

 

 

 

 

posted @ 2013-10-06 08:39  li.zhiliang  阅读(191)  评论(0编辑  收藏  举报