首页 > 代码库 > 【设计模式】—— 享元模式Flyweight
【设计模式】—— 享元模式Flyweight
前言:【模式总览】——————————by xingoo
模式意图
享元模式,也叫【轻量级模式】或者【蝇量级模式】。主要目的就是为了减少细粒度资源的消耗。比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了。
再比如餐馆的桌子,餐具,这些都是享元模式的体现。客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不需要每次新来顾客,就买新的盘子餐具。
应用场景
1 一个系统应用到了大量的对象,而且很多都是重复的。
2 由于大量对象的使用,造成了存储效率上的开销。
3 对象的状态大多是外部状态,不干扰状态本身。
4 如果剔除这些外部状态,可以用一组小规模的对象表示共享对象。
最近项目中就有这个使用场景,比如一些文件的图标,由于重复使用,完全可以采用这种模式,放入缓存中,以后每次调用直接从缓存中读取就行了。
模式结构
FlyweightFactorty 提供共享对象的工厂方法,里面含有一个聚集对象,一般都是用HashMap。通常这个工厂类都通过单例模式创建。
1 class FlyweightFactory{ 2 private HashMap map = new HashMap(); 3 4 public FlyweightFactory() { 5 } 6 7 public Flyweight factory(int state){ 8 if(map.containsKey(state)){ 9 return (Flyweight)map.get(state);10 }else{11 map.put(state, new ConcreteFlyweight(state));12 return (Flyweight)map.get(state);13 }14 }15 16 public void CheckMap(){17 System.out.println("*****************************************");18 int i=0;19 for(Iterator it=map.entrySet().iterator();it.hasNext(); ){20 Map.Entry e = (Map.Entry)it.next();21 System.out.println("map.get("+(i++)+") : "+ e.getKey());22 }23 System.out.println("*****************************************");24 }25 }
Flyweight 共享对象的接口,描述统一标识
1 interface Flyweight{2 public int getState();3 }
ConcreteFlyweight 真正的具体实现类
1 class ConcreteFlyweight implements Flyweight{2 private int state;3 public ConcreteFlyweight(int state) {4 this.state = state;5 }6 public int getState() {7 return state;8 }9 }
全部代码
package com.xingoo.Flyweight;import java.util.HashMap;import java.util.Iterator;import java.util.Map;class FlyweightFactory{ private HashMap map = new HashMap(); public FlyweightFactory() { } public Flyweight factory(int state){ if(map.containsKey(state)){ return (Flyweight)map.get(state); }else{ map.put(state, new ConcreteFlyweight(state)); return (Flyweight)map.get(state); } } public void CheckMap(){ System.out.println("*****************************************"); int i=0; for(Iterator it=map.entrySet().iterator();it.hasNext(); ){ Map.Entry e = (Map.Entry)it.next(); System.out.println("map.get("+(i++)+") : "+ e.getKey()); } System.out.println("*****************************************"); }}interface Flyweight{ public int getState();}class ConcreteFlyweight implements Flyweight{ private int state; public ConcreteFlyweight(int state) { this.state = state; } public int getState() { return state; }}public class Client { public static void main(String[] args) { FlyweightFactory factory = new FlyweightFactory(); factory.factory(4); factory.factory(2); factory.factory(2); factory.factory(1); factory.factory(1); factory.factory(3); factory.CheckMap(); }}
运行结果
*****************************************map.get(0) : 1map.get(1) : 2map.get(2) : 3map.get(3) : 4*****************************************
【设计模式】—— 享元模式Flyweight
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。