一. 只讀對象。例如,一篇英文的文檔是由26個英文字母構成的,每個字母就是一個只讀的對象,多篇文檔可以使用同樣的26個字母對象來組成,沒必要每篇文檔都生成自己的字母對象,這樣做的目的就是爲了節省內存。
二. 共享對象。例如,打印機對象,那麼就必須是用FlyWeight模式了,因爲所有計算機都只能用那一個打印機,也許你會說這應該用單例模式,但是想想如果公司又買了一個打印機,那麼這個打印機也是共享的對象,也就是說,單例模式的目的是同一個類只能生成一個對象,享元模式的目的是同一個類可以實例化不同的對象,但是同樣的對象只能有一個。
下面是一個例子,我們把所有不同的對象放到一個散列表裏面,然後用get(key)的形式來返回一個對象,當用key能在散列表裏面找到相應的對象的時候就直接返回,如果找不到,就實例化一個對象,把它放在散列表裏面,並且返回這個對象,下一次get這個對象的時候就不會再實例化而是直接從散列表裏面返回這個對象的引用。下面是代碼:
- package flyWeight;
- import java.util.Hashtable;
- abstract class Flyweight
- {
- public abstract void operation();
- }
- class ConcreteFlyweight extends Flyweight
- {
- private String string;
- public ConcreteFlyweight(String str)
- {
- string = str;
- }
- public void operation()
- {
- System.out.println("Concrete---Flyweight : " + string);
- }
- }
- class FlyweightFactory{
- private Hashtable<String,Flyweight> flyweights = new Hashtable<String,Flyweight>();
- public FlyweightFactory(){}
- public Flyweight getFlyWeight(Object obj){
- Flyweight flyweight = (Flyweight) flyweights.get(obj);
- if(flyweight == null){
- flyweight = new ConcreteFlyweight((String)obj);
- flyweights.put((String) obj, flyweight);
- }
- return flyweight;
- }
- public int getFlyweightSize(){
- return flyweights.size();
- }
- }
- class FlyweightPattern{
- FlyweightFactory factory = new FlyweightFactory();
- Flyweight fly1;
- Flyweight fly2;
- Flyweight fly3;
- Flyweight fly4;
- Flyweight fly5;
- Flyweight fly6;
- 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 class Test{
- public static void main(String[] args){
- System.out.println("The FlyWeight Pattern!");
- FlyweightPattern fp = new FlyweightPattern();
- fp.showFlyweight();
- }
- }
代碼最核心的部分不是Flyweight和ConcreteFlyweight這兩個類,而是FlyweightFactory這個類裏面的getFlyWeight()這個方法,這個方法實現了前面所描述的功能。
總的來說,其實就一句話,FlyWeight保證沒有相同的對象,Singleton保證只有一個對象。