`
flysnail
  • 浏览: 92848 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

对设计模式—Flyweight模式的认识

阅读更多
单纯享元模式所涉及的角色如下:
抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态(External State)的操作可以通过调用商业方法以参数形式传入。

具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享的。

享元工厂(FlyweightFactory)角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。

客户端(Client)角色:本角色需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态

在饭店里,如果有菜谱所要的菜,就不用去买,直接去菜库里去拿,如果没有就要去买,然后放在菜库里.
public interface FlyWeight
{
    public void buy(People people);
    public String getFoodName();
    public void setFoodName(String foodName);
}
public interface People
{ 
    public void cooking(String foodName);
}

public class Food implements FlyWeight
{
    private String foodName;

    public void buy(People people)
    {
        people.cooking(foodName);
    }

    public String getFoodName()
    {
        return foodName;
    }

    public void setFoodName(String foodName)
    {
        this.foodName = foodName;
    }

}
public class Kitchener implements People
{

    public void cooking(String foodName)
    {
        System.out.println("cooking----"+foodName);

    }
}
public class FlyWeightFactoy
{
    private Hashtable<String, FlyWeight> storage = new Hashtable<String, FlyWeight>();
    
    public FlyWeight getFood(String key)
    {
       FlyWeight food = (FlyWeight) storage.get(key);   
       
       if ( food == null )
       {   
            food = new Food();   
            storage.put( key, food);   
       }          
       return food;
    }
}
public class TestFlyWeight
{
    public static void main(String[] args)
    {
        FlyWeightFactoy factory = new FlyWeightFactoy();
        People people = new Kitchener();
        FlyWeight meal = factory.getFood("Meal");
        meal.setFoodName("Meal");
        meal.buy(people);  
    }

}

享元模式应当在什么情况下使用
当以下所有的条件都满足时,可以考虑使用享元模式:
一个系统有大量的对象。
这些对象耗费大量的内存。
这些对象的状态中的大部分都可以外部化。
这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。
软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。
满足以上的这些条件的系统可以使用享元对象。

最后,使用享元模式需要维护一个记录了系统已有的所有享元的表,而这需要耗费资源。因此,应当在有足够多的享元实例可供共享时才值得使用享元模式。
享元模式的优点和缺点:
享元模式的优点在于它大幅度地降低内存中对象的数量。但是,它做到这一点所付出的代价也是很高的:

享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。
3
0
分享到:
评论
2 楼 flysnail 2008-04-15  
呵呵,多多光临,多多交流
1 楼 oracle123 2008-04-15  
谢谢,很好的主题。

相关推荐

    二十三种设计模式【PDF版】

    设计模式之 Flyweight(共享元) 提供 Java运行性能,降低小而大量重复的类的开销. C. 行为模式 设计模式之 Command(命令) 什么是将行为封装,Command 是最好的说明. 设计模式之 Observer(观察者) 介绍如何使用 ...

    C++设计模式精解

    从提供的文件信息中我们可以提取到的IT知识点主要集中在C++设计模式方面。具体的知识点可以分解为以下几点: ...同时,也能对学习设计模式的过程有一个更全面的认识,从而更好地掌握这些设计思想。

    深入浅出设计模式样章

    《深入浅出设计模式样章》是一本专为软件开发者准备的指南,旨在帮助读者理解和掌握设计模式这一核心编程概念...样章虽然只是全书的一部分,但已经足够让读者对设计模式有初步的认识,并激发他们进一步深入研究的兴趣。

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

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案, 装饰模式 提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由 一些基本功能的排列组合而产生...

    GoF+23种设计模式解析附C++实现源码.pdf

    通过对GoF的23种设计模式的学习和理解,我们可以深刻认识到这些模式对于提高软件质量和效率的重要性。每个模式都针对特定的问题提出了有效的解决方案,帮助我们更好地设计和构建高质量的软件系统。同时,通过实际的...

    23种设计模式(C++).pdf

    而在讨论设计模式时,双分派的概念可以进一步提升对Visitor模式的认识。设计模式的重要性不言而喻,它们是软件设计中不可或缺的工具,能够使开发者更加高效地进行面向对象的分析和设计。 在本书的附录部分,作者...

    C#3.0设计模式.pdf

    通过对比分析,读者可以更清楚地认识到不同模式的适用场景及其优缺点,从而能够更加明智地选择合适的设计模式来解决特定问题。 #### 复合模式 (Composite Pattern) 复合模式允许将对象组织成树形结构来表示“部分-...

    设计模式优缺点及应用场景整理

    "设计模式优缺点及应用场景整理" 设计模式是软件开发中一种重要的概念,它可以帮助开发者更好地组织代码,提高代码的可维护性、可读性和可扩展性。本文总结了23种设计模式的优缺点和应用场景,旨在帮助开发者更好地...

    Head.First设计模式_PDF.part1

    至于第14章则很快地浏览尚未介绍的设计模式,包括Bridge、Builder、Chain of Responsibility、Flyweight、Interpreter、Mediator、Memento、Prototype、Visitor。第1章还介绍了四个OO基本概念(抽象、封装、继承、...

    c#设计模式随书源码.rar

    这些设计模式的源码示例将帮助你深入理解每种模式的核心思想和应用场景,通过实际编码加深对设计模式原理的认识,提升软件开发的灵活性和可维护性。学习并熟练运用这些模式,将有助于你编写出更高质量的C#代码。

    Java常用的设计模式

    ### Java常用的设计模式详解 #### 一、工厂模式(Factory) **工厂模式**是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建一个工厂类来负责创建产品类的对象。当系统需要创建...

    MyBatis学习总结

    类型 设计模式主要分为三类:创建型模式、结构型模式和行为型模式。 1. 创建型模式(Creational Patterns):如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式...

    嵌入式工程师笔试题目.docx

    4. 降低资源使用率的设计模式包括B(Singleton)和C(Flyweight)。 5. 多核处理器上,短临界区且不切换线程的同步机制最优选择是C(Semaphore)。 以上内容展示了嵌入式工程师所需掌握的知识点,包括但不限于编程...

    SpaceGame:Java太空游戏

    《SpaceGame: Java太空游戏深度解析》 在编程领域,Java语言以其强大的跨平台能力和丰富的类库被广泛应用...通过深入理解其技术架构和设计模式,开发者不仅可以学习到游戏开发的技巧,还能对Java编程有更深入的认识。

Global site tag (gtag.js) - Google Analytics