java设计模式--结构型模式--享元模式

                                        享元模式
 概述
    运用共享技术有效地支持大量细粒度的对象。

 适用性
    当都具备下列情况时,使用Flyweight模式:

    1.一个应用程序使用了大量的对象。

    2.完全由于使用大量的对象,造成很大的存储开销。

    3.对象的大多数状态都可变为外部状态。

    4.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。

    5.应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

 参与者
    1.Flyweight
      描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。

    2.ConcreteFlyweight
      实现Flyweight接口,并为内部状态(如果有的话)增加存储空间。
      ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。

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

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

测试类:

 1 public class Test {
 2
 3     public static void main(String[] args) {
 4         Flyweight fly1 = FlyweightFactory.getFlyweight("a");
 5         fly1.action(1);
 6
 7         Flyweight fly2 = FlyweightFactory.getFlyweight("a");
 8         System.out.println(fly1 == fly2);
 9
10         Flyweight fly3 = FlyweightFactory.getFlyweight("b");
11         fly3.action(2);
12         System.out.println(fly1==fly3);
13
14         Flyweight fly4 = FlyweightFactory.getFlyweight("c");
15         fly4.action(3);
16
17         Flyweight fly5 = FlyweightFactory.getFlyweight("d");
18         fly5.action(4);
19
20         System.out.println(FlyweightFactory.getSize());
21     }
22 }
 1 import java.util.HashMap;
 2 import java.util.Map;
 3
 4 public class FlyweightFactory {
 5
 6     private static Map<String, Flyweight> flyweights = new HashMap<String, Flyweight>();
 7
 8     public FlyweightFactory(String arg) {
 9         flyweights.put(arg, new FlyweightImpl());
10     }
11
12     public static Flyweight getFlyweight(String key) {
13         if (flyweights.get(key) == null) {
14             flyweights.put(key, new FlyweightImpl());
15         }
16         return flyweights.get(key);
17     }
18
19     public static int getSize() {
20         return flyweights.size();
21     }
22 }
public interface Flyweight {

    void action(int arg);
}
1 public class FlyweightImpl implements Flyweight {
2
3     public void action(int arg) {
4         // TODO Auto-generated method stub
5         System.out.println("参数值: " + arg);
6     }
7 }
时间: 2024-10-03 05:48:42

java设计模式--结构型模式--享元模式的相关文章

设计模式(结构型)之享元模式(Flyweight Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之外观模式(Facade Pattern)>http://blog.csdn.net/yanbober/article/details/45476527 概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题.所以需要采用一

&quot;围观&quot;设计模式(17)--结构型之享元模式(Flyweight Pattern)

享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存.通常物件中的部分状态是可以分享.常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元.----WIKIPEDIA 个人理解 共享,内存消耗大的时候应考虑对象的共享,共享对象可以减少对象的生成数量,这样可以减少内存的消耗,当一个对象和其他的对象存在共性且内容一致的时候,可以将共有

《精通Python设计模式》学习结构型之享元模式

这个我日常当中也没有用到过, 真的是游戏行业用得多些? 学习一下, 有个印象. import random from enum import Enum TreeType = Enum('TreeTye', 'apple_tree cherry_tree peach_tree') class Tree: pool = dict() def __new__(cls, tree_type): obj = cls.pool.get(tree_type, None) if not obj: obj = o

设计模式(十)享元模式Flyweight(结构型)

说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展性或抽象性的问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.比如:例子1:图形应用中的图元等对象.字处理应用中的字符对象等. 2.解决方案: 享元模式(Flyweight):对象结构型模式运用

Java设计模式(六)合成模式 享元模式

(十一)合成模式 Composite 合成模式是一组对象的组合,这些对象可以是容器对象,也可以是单对象.组对象允许包含单对象,也可以包含其他组对象,要为组合对象和单对象定义共同的行为.合成模式的意义是 保证客户端调用单对象与组合对象的一致性. class TreeNode{ private String name; private TreeNode parent; private Vector<TreeNode> children = new Vector<TreeNode>();

结构型模式 享元模式

结构型模式 享元模式 抽象享元角色:        所有具体享元类的父类,规定一些需要实现的公共接口. 具体享元角色:         抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法.享元工厂角色:         负责创建和管理享元角色. 使用场景:         是以共享的方式,高效的支持大量的细粒度的对象. /** * 结构型模式 享元模式 * Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用. * */ #define _CRT

设计模式学习08:享元模式

设计模式学习08:享元模式 参考资料 https://www.jianshu.com/p/a2aa75939766 https://www.cnblogs.com/adamjwh/p/9070107.html 简介 Use sharing to support large numbers of fine-grained objects efficiently. 使用共享对象可有效地支持大量的细粒度的对象. 享元模式(Flyweight)又称为 轻量级模式,它是一种对象结构型模式. 面向对象技术可

设计模式--组合模式&amp;享元模式&amp;桥梁模式

一.组合模式 组合模式也叫作部分-整体模式,其定义如下:将对象组合成树形结构以表示"部分"和"整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 组合模式的优点和使用场景 优点:1.节点增加和减少是非常自由和方便的,这也是树形结构的一大特点:2.所有节点,不管是分支节点还是叶子结点,不管是调用一个结点,还是调用一个结点群,都是非常方便的.使用场景:1.维护部分与整体的逻辑关系,或者动态调用整体或部分的功能接口,可以考虑使用组合模式.例如,非常多的操作系

Java共享模式/享元模式(Flyweight模式)

Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用(context),是不可共享的,这也Flyweight中两个重要概念内