`

[原]享元模式-复合享元

阅读更多

[关键字]:java,design pattern,设计模式,《Java与模式》学习,Flyweight Pattern,享元模式
[环境]:StarUML5.0 + JDK6
[作者]:Winty (wintys@gmail.com) http://wintys.blogjava.net
[正文]:

享元模式-复合享元:



 

 

package pattern.flyweight.unsharable;
import java.util.*;

/**
 * 复合的享元模式:
 * 复合享元是不能共享的,所以叫Unsharable Flyweight。
 * 但是复合享元是可以分解为可共享的单纯享元。
 *
 * @version 2009-6-25
 * @author Winty(wintys@gmail.com)
 */
public class UnsharableFlyweightTest{
    public static void main(String[] args){
        FlyweightFactory f = new FlyweightFactory();
        
        Flyweight fly = f.factory("aba");
        fly.operation("ex");

        f.checkFlyweight();
    }
}

/**
 * 抽象享元
 */
abstract class Flyweight{
    public abstract void operation(String extrinsicState);
}


/**
 * 具体享元
 */
class ConcreteFlyweight extends Flyweight{
    private Character intrinsicState;

    public ConcreteFlyweight(Character intrinsicState){
        this.intrinsicState = intrinsicState;
    }

    /**
     * 外蕴状态改变方法行为,但不会改变内蕴状态
     */
    @Override
    public void operation(String extrinsicState){
        String str = "intrinsic:" + intrinsicState;
        str += "   extrinsic:" + extrinsicState;
        System.out.println(str);
    }
}


/**
 * 复合享元
 */
class UnsharableFlyweight extends Flyweight{
    private Map<Character , Flyweight> map;

    public UnsharableFlyweight(){
        map = new HashMap<Character , Flyweight>();
    }

    public void add(Character c , Flyweight fly){
        map.put(c , fly);
    }

    @Override
    public void operation(String extrinsicState){
        Iterator<Map.Entry<Character , Flyweight>> it
            = map.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry<Character , Flyweight> entry = it.next();
            Flyweight fly = entry.getValue();
            fly.operation(extrinsicState);
        }
    }
}


/**
 * 享元工厂
 */
class FlyweightFactory{
    private Map<Character , Flyweight> map;

    public FlyweightFactory(){
        map = new HashMap<Character , Flyweight>();
    }

    /**
     * 单纯享元工厂
     */
    public Flyweight factory(Character state){
        Flyweight flyweight = null;

        if(map.containsKey(state)){
            flyweight = map.get(state);
        }
        else{
            flyweight = new ConcreteFlyweight(state);
            map.put(state , flyweight);
        }

        return flyweight;
    }

    /**
     * 复合享元工厂
     * 此处Character的复合类型恰好是String,
     * 当无此巧合时,可使用List等聚集类型传入.
     */
    public Flyweight factory(String compositeState){
        UnsharableFlyweight composite = new UnsharableFlyweight();
        
        for(int i = 0 ; i < compositeState.length(); i++){
            Character c = new Character(compositeState.charAt(i));
            composite.add(c , this.factory(c));
        }

        return composite;
    }

    /**
     * 辅助方法
     */
    public void checkFlyweight(){
        Iterator<Map.Entry<Character , Flyweight>> it
            = map.entrySet().iterator();
        System.out.println("check flyweight:");
        while(it.hasNext()){
            Map.Entry<Character , Flyweight> entry = it.next();
            Character key = entry.getKey();
            System.out.println("key:" + key);
        }
    }
}



运行结果:
intrinsic:b   extrinsic:ex
intrinsic:a   extrinsic:ex
check flyweight:
key:b
key:a

  • 大小: 64.5 KB
分享到:
评论

相关推荐

    设计模式:可复用面向对象软件的基础4

    - **应用场景**:在需要大量相同或相似对象,而又不想消耗过多内存的情况下,可以使用享元模式,通过共享不可变或不变的部分状态,减少对象数量,提高内存利用率。 #### 4. 结构型模式之间的关系 结构型模式之间...

    C#23种设计模式_示例源代码及PDF

    享元模式以共享的方式高效的支持大量 享元模式 的细粒度对象。 享元模式能做到共享的关键是区分内蕴状态和外蕴状态。 内蕴状态存储在享 元内 部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴...

    23种设计模式的基本介绍

    享元模式(Flyweight Pattern) - **定义**:运用共享技术有效地支持大量细粒度的对象。 - **应用场景**: - 一个应用程序使用了大量的相似对象。 - 由于使用大量的对象,造成很大的存储开销。 - **优点**: - ...

    ixix中的design-patterns:Elixir中的常见设计模式

    - 在Elixir中,由于其轻量级进程和内存管理,可以有效地利用享元模式来减少资源消耗。 了解并熟练运用这些设计模式,能够提升Elixir代码的质量,使其更加灵活、可扩展且易于维护。在实际开发中,结合Elixir的特性...

    PHP设计模式之结构模式的深入解析

    享元模式主要用于减少内存中的对象数量,通过共享大量细粒度对象来支持大量对象的创建。在PHP中,享元模式适用于那些内部状态可共享且外部状态可分离的对象,例如处理大量相似数据的场景。 理解并熟练运用这些结构...

    go-patterns:基于重构大师的My Golang设计模式实现

    18. 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。在Go中,通过共享数据结构和利用缓存,可以实现享元模式。 19. 状态机模式(Finite State Machine):定义对象的有限状态集合,以及在各种...

    【中国国际电子商务中心, 京东消费及产业发展研究院, 达达集团研究院】2023即时零售发展趋势白皮书.pdf

    本报告首次提出“即时+“概念,具象化诠释了即时零售在增加本地化即时性供给、拓宽实体害售业务边界、建能全道降本增效、助力音类新业态新模式实现即时化原约、夯实城镇商业教字化基础等诸方面起到的关键性作用。...

Global site tag (gtag.js) - Google Analytics