从七龙珠的角度来看设计模式之享元模式

       转载请声明:http://www.cnblogs.com/courtier/p/4290327.html

  • 人话:

       享元模式:运用共享技术解决大量对象的问题!

  • 前言:

       我所知道的设计模式最难的四大模式之一:享元模式,其他三个分别是:生成器模式,桥接模式,解释器模式!

应用场景:JAVA 字符串内存池.(经常有些面试官问 string 是不是同一对象,其实就是考察享元模式)

•Flyweight

— 描述一个接口,通过这个接口Flyweight可以接受并作用于外部状态。

• ConcreteFlyweight

— 实现Flyweight接口, 并为内部状态( 如果有的话) 增加存储空间。

ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即,它必

须独立于Concrete Flyweight对象的场景。

• UnsharedConcreteFlyweight

— 并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次, UnsharedConcreteFlyweight对象通常

将ConcreteFlyweight对象作为子节点(Row和Conum就是这样)。

• FlyweightFactory

— 创建并管理Flyweight对象。

— 确保合理地共享Flyweight。当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。

• Client

— 维持一个对Flyweight的引用。

— 计算或存储一个(多个)Flyweight的外部状态。

  • 正题:

我们知道七龙珠合并可以变成一条龙(是不是有木有)。假设,你来造这个珠子你会怎么造?肯定有一点这个珠子肯定比较贵(神也有B

UDGET)。神嘛(不是神马),比较聪明,买了个珠子切成七份,两两可以合并(就是说龙珠一号跟龙珠二号合并成龙珠三号-Unshared

ConcreteFlyweight的作用了)。既然,是一个大珠子切成7份,那么,从整体来看就只有一个珠子(不用买7个了欧耶,可以留下来买

其他了O(∩_∩)O哈哈~),接下来,我们就看如何创建这个过程了。

  • 神说:第一步,我要有个接口,这个接口接受外部的龙珠-FlyWeightIn                                           

1:龙珠的共性内容是都叫:“龙珠”。

2:龙珠的差异在于:坐标不同,编号不同。

神就想了,龙珠本来就是一样的,就是上面的点不同和坐标不同而已。换句话说,我拿道龙珠只是改变他的龙珠一部分属性,这个对象还是一样的。

package FlyWeight;

//外部状态:可变的细粒度
//内部状态:提取出可变中不可变的细粒度
interface FlyWeightIn {
    DragonBox operation();
}
  • 神说:第二步,我要有个东西可以返回这个龙珠给别人用得-ConcreteFW (就是说相同的对象返回给别人修改就可以了)
package FlyWeight;

public class ConcreteFW implements FlyWeightIn{

    private DragonBox state;

    //传入享元的对象
    public ConcreteFW(DragonBox state) {
        this.state = state;
    }

    //可以对细粒度进行操作
    @Override
    public DragonBox operation() {
        // TODO Auto-generated method stub
        return state;
    }

}
  • 神说:第三步,我要有个东西能合并龙珠-UnShareConcreteFW (递归合并吧)
package FlyWeight;

//这个类呢,不需要进行构造,因为,可以从内部状态组合成为一致的对象外部状态
public class UnShareConcreteFW  implements FlyWeightIn{

    //自己组合成
    @Override
    public DragonBox operation() {
        // TODO Auto-generated method stub
        return null;
    }

}
  • 神说:第四步,我要有个东西能够管理很多个大珠子-FlyWeightFactory (神的珠子不单单能够变龙,还有些可以变女人的-咳咳)
package FlyWeight;

import java.util.HashMap;

public class FlyWeightFactory {
    //保持多个享元对象
    private static HashMap<String, FlyWeightIn> hashMap = new HashMap<String, FlyWeightIn>();

    public static FlyWeightIn getFlyWeight(String key)
    {
        FlyWeightIn fw = hashMap.get(key);
        //没有享元以共性内容去做为KEY
         if(fw == null)
        {
            DragonBox box = new DragonBox();
            ConcreteFW concreteFW = new ConcreteFW(box);
            hashMap.put(key, concreteFW);

            fw = hashMap.get(key);
        }

        return fw;
    }
}
  • 神说:通过我这个上面工厂函数去调用吧,结果如下:

(源代码:https://github.com/aliencool/Design-Pattrn/tree/master/FlyWeight)

  • 结束语:

       我们可以看到上面的对象都是同一个,只是,他们有些共性粒度可以抽取出来作为键,以后就不用重复的创建大大节省内存(试试七次看能

       不能出现神龙),有问题请给我留言-谢谢。

时间: 2024-08-29 02:54:30

从七龙珠的角度来看设计模式之享元模式的相关文章

设计模式之享元模式

Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. Java中的String类型 在JAVA语言中,String类型就是使用了享元模式.String对象是final类型,对象一旦创建就不可改变.在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝.Stri

纵横之设计模式(享元模式-性能与对象访问)

声明:本系列文章内容摘自<iOS设计模式> 享元模式:运用共享技术有效地支持大量细粒度的对象. 何为享元模式 实现享元模式需要两个关键组件,通常是可共享的享元对象和保存它们的池.某种中央对象维护这个池,并从它返回适当的实例,工厂是这一角色的理想候选.它可以通过一个工厂方法,根据父类型返回各种类型的具体享元对象.其主要目的就是维护池中的享元对象,并适当的从中返回享元对象. 何时使用享元模式 1.应用程序使用很多对象: 2.在内存中保存对象会影响内存性能: 3.对象的多处持有状态(外在状态)可以放

Java设计模式之享元模式实例详解

本文实例讲述了Java设计模式之享元模式.分享给大家供大家参考,具体如下: 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象.比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象.如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了.那么如果要是每个字母都共享一个对象,那么就大大节约了资源. 在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweigh

【设计模式】享元模式(Flyweight)

摘要: 1.本文将详细介绍享元模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入享元模式 2. 享元模式的概念及优缺点介绍 3. 享元模式在Android源码中的应用 1.先来一个段子: GG每天给MM至少发一条短信,而且每天入睡前是必有一条短信的,往往是一些琐事和一些比较肉麻的情话.开始的一个月,GG还对此是乐不可支,随着时间的推移,那些肉麻的话说了很多遍,自己也觉得厌烦了,而且更让人不可忍耐的是这些肉麻的情话每次都要重复的输入.GG把这一烦心事告诉了自己的好友K

Head First设计模式之享元模式(蝇量模式)

一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象.我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式.由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象. 二.结构 三.实现 namespace DesignPattern

设计模式:享元模式(Flyweight)

?运用共享技术有效地支持大量细粒度的对象.又名"蝇量模式". ?在Java语言中,String类型就是使用了享元模式.String对象是final类型,对象一旦创建就不可改变.在JAVA中字符串常量都是存在常量池中的,Java会确保一个字符串常量在常量池中只有一个拷贝.譬如: String a = "abc"; String b = "abc"; System.out.println(a==b); ?输出结果:true.这就说明了a和b量引用都指

设计模式之享元模式--- Pattern Flyweight

模式的定义 享元模式(Flyweight Pattern)是沲技术的重要实现方式,其定义如下: Use sharing to support large numbers of fine-grained objects efficiently. 使用共享对象可有效地支持大量的细粒度的对象. 享元模式的定义提出了二个要求:细粒度的对象和共享对象.分配太多的对象将有损程序的性能,同时还容易造成内存溢出.避免这种情况,就是使用享元模式中的共享技术. 细粒度的状态分为内部状态(instrinsic)和外部

设计模式-12 享元模式(结构型模式)

一 享元模式 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建. 关键代码:存储相似的对象 使用场景: 1.系统有大量相似对象. 2.需要缓冲池的场景. 类图 : 二 实现代码 Java里面的JDBC连接池,适用于作共享的一些个对象,他们有一些共有的属性,就拿数据库连接 池来说,url.driv

JS常用的设计模式(16)—— 享元模式

享元模式主要用来减少程序所需的对象个数. 有一个例子, 我们这边的前端同学几乎人手一本<JavaScript权威指南>. 从省钱的角度讲, 大约三本就够了. 放在部门的书柜里, 谁需要看的时候就去拿, 看完了还回去. 如果同时有4个同学需要看, 此时再去多买一本. 在webqq里面, 打开QQ好友列表往下拉的时候,会为每个好友创建一个div( 如果算上div中的子节点, 还远不只1个元素 ). 如果有1000个QQ好友, 意味着如果从头拉到尾, 会创建1000个div, 这时候有些浏览器也许已