- 浏览: 301563 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
tacyuuhon:
这个代码就有问题。当前的 int activeSessions ...
HttpSessionListener统计在线人数 -
yangleilt:
唉。。能通俗的说一下不?你说的这些百科上到处都是的!
LDAP是什么? -
hezhou_0521:
你显示正确了吗?
HttpSessionListener统计在线人数 -
sevk:
我喜欢用vim或gvim,比Ultra Edit 顺手
让Ultra Edit和Keil结合的更紧密
Flyweight定義:
避免大量擁有相同內容的小類別的開銷(如耗費記憶體),使大家共用一個類別(元類別)。
爲什麽使用?
面向物件語言的原則就是一切都是物件,但是如果真正使用起來,有時物件數可能顯得很龐大,比如,文字處理軟體,如果以每個文字都作爲一個物件,幾千個字,物件數就是幾千,無疑耗費記憶體,那麽我們還是要"求同存異",找出這些物件群的共同點,設計一個元類別,封裝可以被共用的類別,另外,還有一些特性是取決於應用(context),是不可共用的,這也Flyweight中兩個重要概念內部狀態intrinsic和外部狀態extrinsic之分。
說白點,就是先捏一個的原始模型,然後隨著不同場合和環境,再産生各具特徵的具體模型,很顯然,在這裏需要産生不同的新物件,所以Flyweight模式中常出現Factory模式。Flyweight的內部狀態是用來共用的,Flyweight factory負責維護一個Flyweight pool(模式池)來存放內部狀態的物件。
Flyweight模式是一個提高程式效率和性能的模式,會大大加快程式的運行速度。應用場合很多:比如你要從一個資料庫中讀取一系列字串,這些字串中有許多是重復的,那麽我們可以將這些字串儲存在Flyweight池(pool)中。
如何使用?
我們先從Flyweight抽象介面開始:
public interface Flyweight { public void operation( ExtrinsicState state ); } //用於本模式的抽象資料類型(自行設計) |
下面是介面的具體實現(ConcreteFlyweight) ,並爲內部狀態增加記憶體空間, ConcreteFlyweight必須是可共用的,它保存的任何狀態都必須是內部(intrinsic),也就是說,ConcreteFlyweight必須和它的應用環境場合無關。
public class ConcreteFlyweight implements Flyweight { } |
當然,並不是所有的Flyweight具體實現子類別都需要被共用的,所以還有另外一種不共用的ConcreteFlyweight:
public class UnsharedConcreteFlyweight implements Flyweight { public void operation( ExtrinsicState state ) { } } |
Flyweight factory負責維護一個Flyweight池(存放內部狀態),當用戶端請求一個共用Flyweight時,這個factory首先搜索池中是否已經有可適用的,如果有,factory只是簡單返回送出這個物件,否則,創建一個新的物件,加入到池中,再返回送出這個物件池
public class FlyweightFactory { //Flyweight pool private Hashtable flyweights = new Hashtable(); public Flyweight getFlyweight( Object key ) { Flyweight flyweight = (Flyweight) flyweights.get(key); if( flyweight == null ) { return flyweight; |
至此,Flyweight模式的基本框架已經就緒,我們看看如何呼叫:
FlyweightFactory factory = new FlyweightFactory();
Flyweight fly1 = factory.getFlyweight( "Fred" );
Flyweight fly2 = factory.getFlyweight( "Wilma" );
......
從呼叫上看,好象是個純粹的Factory使用,但奧妙就在於Factory的內部設計上。
Flyweight模式在XML等資料源中應用
我們上面已經提到,當大量從資料源中讀取字串,其中肯定有重復的,那麽我們使用Flyweight模式可以提高效率,以唱片CD爲例,在一個XML文件中,存放了多個CD的資料。
每個CD有三個欄位:
1.出片日期(year)
2.歌唱者姓名等資訊(artist)
3.唱片曲目 (title)
其中,歌唱者姓名有可能重復,也就是說,可能有同一個演唱者的多個不同時期 不同曲目的CD。我們將"歌唱者姓名"作爲可共用的ConcreteFlyweight。其他兩個欄位作爲UnsharedConcreteFlyweight。
首先看看資料源XML文件的內容:
<?xml version="1.0"?> <collection> <cd> <cd> <cd> ....... </collection> |
雖然上面舉例CD只有3張,CD可看成是大量重復的小類別,因爲其中成分只有三個欄位,而且有重復的(歌唱者姓名)。
CD就是類似上面介面 Flyweight:
public class CD { private String title; |
將"歌唱者姓名"作爲可共用的ConcreteFlyweight:
public class Artist { //內部狀態 // note that Artist is immutable. Artist(String n){ |
再看看Flyweight factory,專門用來製造上面的可共用的ConcreteFlyweight:Artist
public class ArtistFactory { Hashtable pool = new Hashtable(); Artist result; |
當你有幾千張甚至更多CD時,Flyweight模式將節省更多空間,共用的flyweight越多,空間節省也就越大。
发表评论
-
第四篇:设计模式与Struts介绍篇
2004-06-24 07:02 712严重警告:只关心程序的人请跳过<o:p></ ... -
设计模式之Factory
2004-06-24 19:47 587定义:提供创建对象的接口. 为何使用?工厂模式是我们最常用的模 ... -
設計模式之Prototype(原型)
2004-06-24 19:48 637定義:用原型實例指定創建物件的種類,並且通過拷貝這些原型創建新 ... -
设计模式之Singleton(单态)
2004-06-24 19:49 292定义:Singleton模式主要作用是保证在Java应用程序中 ... -
設計模式之Builder
2004-06-24 19:49 576Builder模式定義:將一個 ... -
設計模式之Facade(外觀)
2004-06-24 19:50 493Facade的定義: 爲子系統中的一組介面提供一個一致的介面。 ... -
設計模式之Proxy(代理)
2004-06-24 19:51 731理解並使用設計模式,能夠培養我們良好的面向物件編程習慣,同時在 ... -
設計模式之Adapter(適配器)
2004-06-24 19:52 586定義:將兩個不相容的類別糾合在一起使用,屬於結構型模式,需要有 ... -
設計模式之Composite(組合)
2004-06-24 19:53 561Composite定義:將物件以樹 ... -
設計模式之Decorator(油漆工)
2004-06-24 19:54 651Decorator常被翻譯成"裝飾",我覺 ... -
設計模式之Bridge
2004-06-24 19:55 566Bridge定義 :將抽象和行為劃分開來,各自獨立,但能動態的 ... -
設計模式之Template
2004-06-24 19:57 547Template定義:定義一個操作中演算法的骨架,將一些步驟的 ... -
設計模式之Memento(備忘機制)
2004-06-24 19:58 567Memento定義:memento是一個保存另外一個物件內部狀 ... -
設計模式之Observer
2004-06-24 20:06 643Java深入到一定程度,就 ... -
設計模式之Command
2004-06-24 20:07 591Command模式是最讓我疑惑的一個模式,我在閱讀了很多代碼後 ... -
設計模式之Chain of Responsibility(職責鏈)
2004-06-24 20:07 593Chain of Responsibility定義Ch ... -
設計模式之State
2004-06-24 20:09 653State的定義: 不同的狀態,不同的行爲;或者說,每個狀態有 ... -
設計模式之Strategy(策略)
2004-06-24 20:10 547Strategy是屬於設計模式 ... -
設計模式之Mediator(仲介者)
2004-06-24 20:12 570Mediator定義:用一個仲介物件來封裝一系列關於物件交互行 ... -
設計模式之Visitor
2004-06-24 20:13 602Visitor定義作用於某個物件群中各個物件的操作。 它可以使 ...
相关推荐
享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建大量小对象所带来的内存开销。通过共享对象,享元模式能够有效地支持大量细粒度的对象,减少内存使用并提高性能。它常用于需要大量重复对象的场景...
"Flyweight"(享元)设计模式是一种结构型模式,其核心目的是为了有效地支持大量细粒度对象的创建和使用,通过共享已经存在的对象来减少内存消耗,提高系统性能。在C#中,Flyweight模式尤其适用于那些内部状态可共享...
享元模式(Flyweight Pattern)是软件设计中的一种结构型设计模式,它通过共享技术来支持大量细粒度的对象,以此来降低内存中对象的数量。在PHP中实现享元模式,可以帮助我们优化程序性能,特别是在对象数目过多时,...
享元模式是设计模式中的一种结构型模式,它主要通过共享已有对象来减少内存中对象的数量,从而提高系统性能。在C#编程中,享元模式尤其适用于那些创建大量相似对象且内存消耗较大的场景。本篇文章将深入探讨享元模式...
享元模式是一种设计模式,属于构造型模式,其主要目的是减少对象的数量,通过共享大量相似对象的内部状态来节省内存。这种模式在处理大量细粒度对象时特别有用,能够有效地提高系统的性能。 享元模式的核心是...
本文将深入探讨“轻量级”设计模式之一——Flyweight(享元)模式,它是如何在减少内存消耗的同时提高系统性能的。 Flyweight模式的核心思想是共享对象,通过复用大量相似对象来减少内存占用。这种模式通常在处理...
在这个“C#面向对象设计模式纵横谈(12)”中,我们将深入探讨享元模式的概念、实现方式以及如何在实际项目中应用。 享元模式的核心思想是区分对象的状态和行为。状态分为内部状态和外部状态,其中内部状态是对象共有...
C++设计模式之享元模式(Flyweight) C++设计模式之享元模式(Flyweight)是一种结构型设计模式,主要用于解决大量相似对象的创建和操作所带来的内存负载问题。该模式的主要设计目标是通过共享对象来减少内存负载,...
享元模式(Flyweight Pattern)是一种结构型设计模式,它能有效地减少系统中对象的数量,从而降低内存消耗,提高性能。这种模式通过共享大量相似对象的内部状态来达到这一目标,而只保留对象的外部状态在外部管理。...
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第12节:结构型模式Flyweight享元模式
C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式)
享元模式是一种设计模式,属于对象结构型模式,它的核心思想是通过共享大量细粒度对象来减少系统内存的使用,提高系统性能。在软件工程中,当系统中存在大量相似对象时,享元模式可以有效地减少内存开销,尤其在处理...
享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在大量对象创建时。享元模式通过共享已有对象来减少内存中对象的数量,从而达到降低内存消耗的效果。这种模式适用于那些轻量级对象,...
### C++设计模式之享元模式详解 #### 一、享元模式概述 享元模式(Flyweight Pattern)是设计模式中的一种优化模式,主要用于减少创建大量相似对象所需的内存消耗。在C++程序设计中,当系统中存在大量的相同或相似...
设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy...
享元模式是一种设计模式,主要用于减少对象的创建,从而提高性能和降低内存占用。在C++编程中,享元模式的应用能够帮助优化内存管理和提高程序效率。享元模式的核心思想是区分对象的内部状态(intrinsic state)和...
享元模式是软件设计模式中的一种结构型模式,它的核心思想是通过共享已经存在的对象来减少内存中的对象数量,从而提高系统性能。在Java中,享元模式常用于处理大量相似对象的场景,例如在图形界面中绘制大量相似的...
享元模式是软件设计模式中的一种结构型模式,它的主要目的是通过共享大量细粒度对象来减少内存的使用,提高系统性能。在许多场景下,尤其是处理大量相似对象时,享元模式能显著减少内存开销。这个压缩包文件...
设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy...