- 浏览: 98322 次
- 性别:
- 来自: 深圳
文章分类
最新评论
Flyweight模式也叫享元模式,是由GoF提出的23种设计模式中的一种。Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。
本文介绍设计模式中的享元(Flyweight)模式的概念,用法,以及实际应用中怎么样使用Flyweight模式进行开发。
Flyweight通过与其他类似对象共享数据来减小内存占用。简单地说,Flyweight模式为类的所有具有相同状态的对象分配同一个实例来达到减小内存占用的目的。
我们通过Flyweight模式的类图来说明Flyweight模式:
[出自:维基百科wikipedia.org]
Flyweight
目标类。需要与其他类似对象共享数据来减小内存占用的某一类事物的抽象
FlyweightFactory
对Flyweight实例提供管理的类
调用方在生成Flyweight实例时,不直接通过new的方式而是通过FlyweightFactory#getFlyweight()取得Flyweight的一个实例。
而FlyweightFactory 对象对Flyweight实例进行管理:
调用时当Flyweight的相应实例还未生成时,则:
1,生成Flyweight实例
2,将生成的Flyweight实例保存到对象池中(pooling)
3,返回该Flyweight实例
调用时当Flyweight的相应实例已经生成时,则:
1,从对象池取出该Flyweight实例
2,返回该Flyweight实例
通过以上处理,一方面,FlyweightFactory可以在对象池里只保存最少限度的Flyweight实例;另一方面,调用方可以不用理会FlyweightFactory的内部实现细节而可以取得Flyweight实例。
代码:
运行并显示Client:
需要删除Flyweight某实例时,应该通过FlyweightFactory加以删除。
为了调用方便,FlyweightFactory类一般使用Singleton模式实现。
设计模式之Abstract Factory - 抽象工厂模式
设计模式之Factory Method - 工厂方法模式
通过比较,我们可以发现Flyweight模式与工厂模式存在某些相似之处:都提供了对象工厂的功能,生成了类的实例供外部调用。
但Flyweight模式的目的是使某些相似对象共用类的同一个实例以达到节省内存空间的目的;工厂模式则不强制这一点,它只是负责生成类的实例,另外,工厂模式还通过工厂的继承来生成具有继承关系的不同类的实例,而Flyweight模式不强调这一点。
Flyweight模式的概念
Flyweight通过与其他类似对象共享数据来减小内存占用。简单地说,Flyweight模式为类的所有具有相同状态的对象分配同一个实例来达到减小内存占用的目的。
我们通过Flyweight模式的类图来说明Flyweight模式:
[出自:维基百科wikipedia.org]
Flyweight
目标类。需要与其他类似对象共享数据来减小内存占用的某一类事物的抽象
FlyweightFactory
对Flyweight实例提供管理的类
调用方在生成Flyweight实例时,不直接通过new的方式而是通过FlyweightFactory#getFlyweight()取得Flyweight的一个实例。
而FlyweightFactory 对象对Flyweight实例进行管理:
调用时当Flyweight的相应实例还未生成时,则:
1,生成Flyweight实例
2,将生成的Flyweight实例保存到对象池中(pooling)
3,返回该Flyweight实例
调用时当Flyweight的相应实例已经生成时,则:
1,从对象池取出该Flyweight实例
2,返回该Flyweight实例
通过以上处理,一方面,FlyweightFactory可以在对象池里只保存最少限度的Flyweight实例;另一方面,调用方可以不用理会FlyweightFactory的内部实现细节而可以取得Flyweight实例。
Flyweight模式的实现范例
我们以公交公司的公交车为例:某公交公司有编号为A,B,C,D的公交车,同一编号的公交车最多只有一辆,对于需要使用这些公交车的任何客户,通过同一编号取车的话,不管是谁,取出来的都是同一辆车。这种情况,我们可以用Flyweight模式来实现。代码:
import java.util.HashMap;
import java.util.Map;
/** Flyweight */
class Bus {
private String number;
public Bus(String number) {
this.number = number;
}
public void printNumber() {
System.out.println(number);
}
}
/** FlyweightFactory */
class BusFactory {
Map<String, Bus> pool;
public BusFactory(){
this.pool = new HashMap<String, Bus>();
}
public Bus getBus(String number){
Bus bus = this.pool.get(number);
if(bus == null) {
bus = new Bus(number);
this.pool.put(number, bus);
}
return bus;
}
}
//Test:
public class Client {
public static void main(String []args) {
BusFactory busFactory = new BusFactory();
Bus bus1 = busFactory.getBus("A");
Bus bus2 = busFactory.getBus("B");
Bus bus3 = busFactory.getBus("C");
Bus bus4 = busFactory.getBus("D");
Bus bus5 = busFactory.getBus("E");
Bus bus6 = busFactory.getBus("B");
bus1.printNumber();
bus2.printNumber();
bus3.printNumber();
bus4.printNumber();
bus5.printNumber();
bus6.printNumber();
System.out.println("bus2 = bus6:" + bus2.equals(bus6));
}
}
import java.util.Map;
/** Flyweight */
class Bus {
private String number;
public Bus(String number) {
this.number = number;
}
public void printNumber() {
System.out.println(number);
}
}
/** FlyweightFactory */
class BusFactory {
Map<String, Bus> pool;
public BusFactory(){
this.pool = new HashMap<String, Bus>();
}
public Bus getBus(String number){
Bus bus = this.pool.get(number);
if(bus == null) {
bus = new Bus(number);
this.pool.put(number, bus);
}
return bus;
}
}
//Test:
public class Client {
public static void main(String []args) {
BusFactory busFactory = new BusFactory();
Bus bus1 = busFactory.getBus("A");
Bus bus2 = busFactory.getBus("B");
Bus bus3 = busFactory.getBus("C");
Bus bus4 = busFactory.getBus("D");
Bus bus5 = busFactory.getBus("E");
Bus bus6 = busFactory.getBus("B");
bus1.printNumber();
bus2.printNumber();
bus3.printNumber();
bus4.printNumber();
bus5.printNumber();
bus6.printNumber();
System.out.println("bus2 = bus6:" + bus2.equals(bus6));
}
}
运行并显示Client:
C:\Flyweight>javac *.java
C:\Flyweight>java Client
A
B
C
D
E
B
bus2 = bus6:true
C:\Flyweight>
C:\Flyweight>java Client
A
B
C
D
E
B
bus2 = bus6:true
C:\Flyweight>
Flyweight模式使用提示
Flyweight模式一般用于外部操作不改变Flyweight实例状态的情况下。因为如果外部操作取出了Flyweight的一个实例并在外部改变了其状态后,下一次操作取得的同一个Flyweight实例可能并具有我们所要求的状态了。需要删除Flyweight某实例时,应该通过FlyweightFactory加以删除。
为了调用方便,FlyweightFactory类一般使用Singleton模式实现。
Flyweight模式与工厂模式的区别
有关工厂模式的文章请参考:设计模式之Abstract Factory - 抽象工厂模式
设计模式之Factory Method - 工厂方法模式
通过比较,我们可以发现Flyweight模式与工厂模式存在某些相似之处:都提供了对象工厂的功能,生成了类的实例供外部调用。
但Flyweight模式的目的是使某些相似对象共用类的同一个实例以达到节省内存空间的目的;工厂模式则不强制这一点,它只是负责生成类的实例,另外,工厂模式还通过工厂的继承来生成具有继承关系的不同类的实例,而Flyweight模式不强调这一点。
发表评论
-
设计模式之 State - 状态模式
2010-12-18 16:49 1071State模式也叫状态模式,是由GoF提出的23种软件设计模式 ... -
设计模式之 Strategy - 策略模式
2010-12-18 16:46 1343Strategy模式也叫策略模 ... -
设计模式之 Visitor - 访问者模式
2010-12-18 16:45 1443Visitor模式也叫访问者 ... -
设计模式之 Template Method - 模板方法模式
2010-12-18 16:41 1562Template Method模式也叫模板方法模式,是由G ... -
设计模式之 Observer - 观察者模式
2010-12-18 16:33 1371Observer模式也叫观察者 ... -
设计模式之 Memento - 备忘录模式
2010-12-18 16:31 1043Memento模式也叫备忘录 ... -
设计模式之 Mediator - 中介者模式
2010-12-18 16:29 1103Mediator模式也叫中介者模式,是由GoF提出的23种软件 ... -
设计模式之 Iterator - 迭代模式
2010-12-18 16:27 1162Iterator模式也叫迭代模式,是由GoF提出的23种设 ... -
设计模式之 Interpreter - 解释器模式
2010-12-18 16:23 983Interpreter模式也叫解释器模式,是由GoF提出的 ... -
设计模式之 Command - 命令模式
2010-12-18 16:20 862Command(CoR)模式也叫命 ... -
设计模式之 Chain of Responsibility - 职责链模式
2010-12-18 16:18 1190Chain of Responsibility(CoR)模 ... -
设计模式之 Proxy - 代理模式
2010-12-16 23:45 1040Proxy模式也叫代理模式,是由GoF提出的23种软件设计 ... -
设计模式之 Facade - 外观模式
2010-12-16 23:41 991Facade模式也叫外观模式 ... -
设计模式之 Singleton - 单态模式
2010-11-26 11:58 845Singleton模式也叫单态模式,是由GoF提出的2 ... -
设计模式之 Decorator - 装饰模式
2010-11-25 23:48 802装饰模式,The Decorator Pattern atta ... -
设计模式之 Composite - 组合模式
2010-11-25 23:35 1448Composite模式也叫组合 ... -
设计模式之 Bridge - 桥接模式
2010-11-25 23:08 1006Bridge模式也叫桥接模式,是由GoF提出的23种软件设计模 ... -
设计模式之 Adapter - 适配器模式
2010-11-25 22:58 904Adapter模式也叫适配器模式,是由GoF提出的23种设 ... -
设计模式之Prototype - 原型模式
2010-11-25 22:14 1123Prototype模式也叫原型模式,是由GoF提出的23种设计 ... -
设计模式之 Builder - 建造者模式
2010-11-18 23:51 1034Builder模式也叫建造者模式或者生成器模式,是由GoF ...
相关推荐
设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx
设计模式(C#)之享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度的对象。
c++设计模式-结构型模式-享元模式;qt工程;c++简单源码; 享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类...
C++设计模式课件13_Flyweight_享元模式.pdf
设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy...
主要为大家详细介绍了C++设计模式之享元模式Flyweight,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy...
C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)
享元模式英文称为“Flyweight Pattern”,我非常感谢将Flyweight Pattern翻译成享元模式的那位强人,因为这个词将这个模式使用的方式明白得表示了出来;如果翻译成为羽量级模式或者蝇量级模式等等,虽然可以含蓄的...
- 享元模式(Flyweight) - 观察者模式(Observer) - 模板方法模式(Template Method) - 策略模式(Strategy) - 责任链模式(Chain of Responsibility) - 中介者模式(Mediator) - 访问者模式(Visitor) - 命令模式...
Flyweight:享元对象IntrinsicState:内部状态,享元对象共享内部状态ExtrinsicState:外部状态,每个享元对象的外部状态不同pub
结构模式:设计模式之Facade(外观),设计模式之Proxy(代理),设计模式之Adapter(适配器),设计模式之Composite(组合),设计模式之Decorator(油漆工),设计模式之Bridge,设计模式之Flyweight(享元). 行为模式:设计模式之...
FlyWeight享元 --- 对象结构型模式
主要介绍了C++设计模式编程的Flyweight享元模式结构,享元模式在实现过程中主要是要为共享对象提供一个存放的"仓库"(对象池),需要的朋友可以参考下
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第12节:结构型模式Flyweight享元模式
C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式)
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
4.6 Flyweight(享元)—对象结构型模式 128 4.7 Proxy(代理)—对象结构型模式 137 4.8 结构型模式的讨论 144 4.8.1 Adapter 与 Bridge 144 4.8.2 Composite、 Decorator 与 Proxy 145 第 5 章 行为模式 147 5.1 ...
主要介绍了Java设计模式之共享模式/享元模式(Flyweight模式)介绍,本文讲解了为什么使用共享模式/享元模式、如何使用共享模式/享元模式、Flyweight模式在XML等数据源中应用等内容,需要的朋友可以参考下
在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在源码中的使用,每种设计模式都举了一个简单的小例子来进行实现,并加以注释 包名解释 一、DesignPattern 1.1 创建型模式 ...