适配器模式之享元模式

设计模式目录
http://blog.csdn.net/fenglailea/article/details/52733435
风.fox

享元模式 Flyweight Pattern

使用共享对象可有效地支持大量的细粒度的对象

通用类图

组成

  • 抽象享元角色 Flyweight
    简单的说就是一个产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现
  • 具体享元角色 ConcreteFlyweight
    具体的一个产品类,实现抽象角色定义的业务。该角色中需要注意的是内部状态处理应该与环境无关,不应该出现一个操作改变了内部状态,同事修改了外部状态,这是绝度不允许的
  • 不可共享的享元角色 unshareConcreteFlyweight
    不存在外部状态或者安全要求(如线程安全)不能够使用共享技术的对象,该对象一般不会出现在享元工厂中
  • 享元工厂 FlyweightFactory
    职责非常简单,就是构造一个池容器,同时提供从池中获得对象的方法

通用源码

JAVA

//抽象享元角色
public abstract class Flyweight{
    //内部状态
    private String intrinsic;
    //外部状态
    protected final String Extrinsic;
    //要求享元角色必须接受外部状态
    public Flyweight(String _Extrinsic){
        this.Extrinsic=_Extrinsic;
    }
    //定义业务操作
    public abstract void operate();
    //内部状态的
    public String getIntrinsic(){
        return intrinsic;
    }
    public void setIntrinsic(String intrinsic){
        this.intrinsic=intrinsic;
    }
}
//具体享元角色
public class ConcreteFlyweight1 extends Flyweight{
    //接受外部状态
    public ConcreteFlyweight1(String _Extrinsic){
        super(_Extrinsic);
    }
    //根据外部状态进行逻辑处理
    public void operate(){
        ....
    }
}
public class ConcreteFlyweight2 extends Flyweight{
    //接受外部状态
    public ConcreteFlyweight2(String _Extrinsic){
        super(_Extrinsic);
    }
    //根据外部状态进行逻辑处理
    public void operate(){
        ....
    }
}
//享元工厂
public class FlyweightFactory{
    //定义一个池容器
    private static HashMap<String,Flyweight> pool=new HashMap<String,Flyweight>();
    //享元工厂
    public static Flyweight getFlyweight(String Extrinsic){
        //需要返回的对象
        Flyweight flyweight=null;
        //在池中没有该对象
        if(pool.containsKey(Extrinsic)){
            flyweight=pool.get(Extrinsic);
        }else{
            //根据外部状态创建享元对象
            flyweight=new ConcreteFlyweight1(Extrinsic);
            //放到池中
            pool.put(Extrinsic,flyweight);
        }
        return flyweight;
    }
}

使用场景

系统中存在大量的相似对象
细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
需要缓冲池的场景

时间: 2024-09-16 04:49:10

适配器模式之享元模式的相关文章

减小内存的占用问题——享元模式和单例模式的对比分析

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!总结的知识点如下: 享元模式概念和实现例子 使用了享元模式的Java API String类 java.lang.Integer 的 valueOf(int)方法源码分析 使用享元模式的条件 享元模式和单例模式的区别 前面的策略模式的话题提起了:如何解决策略类膨胀的问题,说到 "有时候可以通过把依赖于环境Context类的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用."换言之,可以使

php设计模式 FlyWeight (享元模式)

复制代码 代码如下: <?php /** * 享元模式 * * 运用享元技术有效的支持大量细粒度的对象 */ class CD { private $_title = null; private $_artist = null; public function setTitle($title) { $this->_title = $title; } public function getTitle() { return $this->_title; } public function s

DotNet Framework源代码中的模式(九)——Flyweight(享元模式)

运用共享技术有效地支持大量细粒度的对象. 在.Net中处理字符串时,有一个很重要的机制,叫做字符串驻留机制,就是运用了享元模式.CLR(公共语言运行库)通过维护一个表来存放字符串,该表称为拘留池,它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用.因此,具有特定值的字符串的实例在系统中只有一个. CLR中使用享元模式实现字符串驻留的过程:CLR内部维护着一块特殊的数据结构--我们可以把它看成是一个Hash table,这个Hash table维护者大部分创建的string(我这里没有说

重温设计模式(一)——享元模式(Flyweight)

一.世间万物皆为对象 从大学校园中拦住一个软件工程专业的学生,问他,什么是面向对象.他会告诉你,世间万物皆是对象. 世界之大,何止万物.上至宇宙星辰,下至细菌病毒.皆为对象. 女孩,吐气如兰,仍留淡淡余香. 男孩,闭眼陶醉,不亦乐乎. 二.对象爆炸 呼吸之间,分子无数. 每个分子皆为一对象,恐万台服务器之矩阵亦无可容. 奈何乎? GOF 曰:享元模式! 三.何为享元模式 Flyweight : 次最轻量级的拳击选手.即粒度最小. 因此,享元模式的目的是采用共享技术解决大量细粒度对象的爆炸问题.

设计模式学习笔记(二十二)—FlyWeight享元模式

一.FlyWeight模式定义: 运用共享技术有效地支持大量细粒度对象. 二.模式解说 也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象.在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式.Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对象.Flyweight模式是一个提高程序效率和性能的

.NET设计模式(13):享元模式(Flyweight Pattern)

本文试图通过一个简单的字符处理的例子,运用重构的手段,一步步带你走进Flyweight模式,在这个过程中我们一同思考.探索.权衡,通过比较而得出好的实现方式,而不是给你最终的一个完美解决方案. 主要内容: 1.Flyweight模式解说 2..NET中的Flyweight模式 3.Flyweight模式的实现要点 -- 概述 面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时

.net设计模式实例之享元模式( Flyweight Pattern)

一.享元模式简介(Brief Introduction) 享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象. Use sharing to support large numbers of fine-grained objects efficiently. 享元模式可以避免大量非常相似类的开销.在程序设计中有时需要生成大量细粒度的类 实例来表示数据.如果发现这些实例除了几个参数外基本伤都是相同的,有时就能够受大幅 度第减少需要实例化的类的数量.如果能把这些参数

JS实现简单的图书馆享元模式实例

  本文实例讲述了JS实现简单的图书馆享元模式.分享给大家供大家参考.具体如下: ? 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

C++设计模式---享元模式----浪费可耻,节俭光荣

概述 一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题. 想想我们编辑文档用的word,文档里文字很多都是重复的,我们不可能为每一个出现的汉字都创建独立的空间,这样代价太大,那么我们如何去避免系统中出现大量相同或相似的对象,同时又不影响客户端程序通过面向对象的方式对这些对象进行操作? 享元模式正为解决这一类问题而诞生.享元模式通过共享技术实现相同或相似对象的重用,在逻辑上每一个出现的字符都有一个对象与之对应,然而在物理上它们却共享同一个享元对象,这个对象可以出现