享元模式-Flyweight

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

内部状态和外部状态:

  享元模式可以避免大量的非常相似的类的开销.在程序设计中,有时需要生成大量细粒度的类实例来表示数据.如果能发现这些实例除了几个参数外基本上都相同,有时就能大幅度减少需要实例化的类的数量.如果能把那些参数移到类实例的外部,在方法调用时将它们传递进来,就可以通过共享,大幅度地减少单个实例的数目.

何时使用享元模式:

  如果一个应用程序使用了大量的对象,而大量的这些对象造成了存储开销时就应该考虑使用;还有就是对象的部分状态可已放到外部,那就可以用较少的共享对象来表示很多组对象.

享元模式结构图:

代码实现:

 1 package com.cgj.pattern.flyweight;
 2
 3 /**
 4  * Flyweight接口:是多有享元类的超类或接口,通过这个接口,
 5  *      Flyweight可以接受并作用于外部状态.
 6  */
 7 public interface Flyweight {
 8
 9     public abstract void operation(int extrinsicstate);
10 }
 1 package com.cgj.pattern.flyweight;
 2
 3 /**
 4  * ConcreteFlyweight类实现Flyweight接口,并为内部状态增加存储空间.
 5  */
 6 public class ConcreteFlyweight implements Flyweight {
 7
 8     @Override
 9     public void operation(int extrinsicstate) {
10         System.out.println("具体的Flyweight:" + extrinsicstate);
11     }
12
13 }
 1 package com.cgj.pattern.flyweight;
 2
 3 /**
 4  * UnsharedConcreteFlyweight指不需要共享的Flyweight实现类.
 5  *      因为实现了Flyweight接口共享成为可能,但并不强制共享.
 6  */
 7 public class UnsharedConcreteFlyweight implements Flyweight {
 8
 9     @Override
10     public void operation(int extrinsicstate) {
11         System.out.println("不共享的具体Flyweight:" + extrinsicstate);
12     }
13
14 }
 1 package com.cgj.pattern.flyweight;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6 /**
 7  * Flyweight是一个享元工厂,用来创建并管理Flyweight类对象.
 8  *      它主要用来确保合理的共享Flyweight,当用户请求一个Flyweight时,
 9  *      它创建一个Flyweight或者返回一个已经创建好的Flyweight.
10  */
11 public class FlyweightFactory {
12
13     // 保存Flyweight
14     private Map<String, Flyweight> flyweights = new HashMap<String, Flyweight>();
15
16     // 获取Flyweight
17     public Flyweight getFlyweight(String key) {
18         if (!flyweights.containsKey(key)) {
19             flyweights.put(key, new ConcreteFlyweight());
20         }
21         return flyweights.get(key);
22     }
23
24 }
 1 package com.cgj.pattern.flyweight;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6         int extrinsicstate = 22;
 7
 8         FlyweightFactory factory = new FlyweightFactory();
 9
10         Flyweight fx = factory.getFlyweight("X");
11         fx.operation(extrinsicstate--);
12
13         Flyweight fy = factory.getFlyweight("Y");
14         fy.operation(extrinsicstate--);
15
16         Flyweight fz = factory.getFlyweight("Z");
17         fz.operation(extrinsicstate--);
18
19         Flyweight uf = new UnsharedConcreteFlyweight();
20         uf.operation(extrinsicstate);
21     }
22
23 }

(本随笔参考了 程杰老师的 <<大话设计模式>>)

时间: 2024-12-09 15:56:54

享元模式-Flyweight的相关文章

享元模式Flyweight

享元模式 享元模式Flyweight,布布扣,bubuko.com

二十四种设计模式:享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支持这些对象. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Flyweight { /// <summary> /// Message实体类 ///

享元模式-Flyweight(Java实现)

享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, 就到家里的书架上拿, 如果有就直接看, 没有就去买一本, 回家看. 看完了就放到家里的书架上, 以后再想看了直接就在书架上拿, 不需要再去买同样的这本书了. 不适用享元模式: 小明想看编程技术的书, 就去书店里买一本回家看, 买完后看完了, 书就不知道丢到了哪里去了. 下次想看的时候就找不到了,

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

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

设计模式 笔记 享元模式 Flyweight

//---------------------------15/04/20---------------------------- //Flyweight 享元模式------对象结构型模式 /* 1:意图: 运用共享技术有效地支持大量细粒度的对象. 2:动机: 3:适用性: 以下条件都成立时才能使用. 1>一个应用程序使用了大量的对象. 2>完全由于使用大量的对象,造成很大的存储开销. 3>对象的大多数状态都可变为外部状态. 4>如果删除对象的外部状态,那么可以用相对较少的共享对

【设计模式】—— 享元模式Flyweight

前言:[模式总览]——————————by xingoo 模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了. 再比如餐馆的桌子,餐具,这些都是享元模式的体现.客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不需要每次新来顾客,就买新的盘子餐具. 应用场景 1 一个系统应用到了大量的对象,而且很多都是

设计模式之享元模式(Flyweight)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

设计模式之二十二:享元模式(FlyWeight)

享元模式: 使用共享技术有效地支持大量细粒度的对象. Use sharing to support large numbers of fine-grained objects efficiently. 这个设计模式和它的名字一样核心是为了共享代码. UML图: 主要包括: FlyWeight:声明了一个接口,通过这个接口所有的FlyWeight能够接受并作用于外部的状态. ConcreteFlyWeight:实现了FlyWeight声明的接口,并且可能会增加一些内部状态. UnSharedCon

12.享元模式(Flyweight Pattern)

using System; using System.Collections; namespace ConsoleApplication5 { class Program { /// <summary> /// 在软件开发过程,如果我们需要重复使用某个对象的时候, /// 如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了, /// 这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然而享元模式可以解决这个问题, /// 下面具体看看享元模式是如何去