- 浏览: 211575 次
- 性别:
- 来自: 北京
文章分类
通常情况下,我们会需要使用某个对象的时候会直接new,然后使用完后就等着垃圾回收器回收,但是如果访问量比较大new的对象比较多,那么很有可能会造成内存数据过大甚至是溢出的情况。享元模式最主要的目的就是解决减少大量创建新的对象,让多个对象引用公用缓存中的同一个对象。有点类始于连接池,当你需要的时候返回一个你所需的对象一样。
享元模式一共包含2个重要概念,一个是内蕴状态和外蕴状态。两种状态的充当者你可以根据自己的需要进行实现。
内蕴状态表示多个对象共享的部分。
外蕴状态表示每个对象独有的状态部分。
如现实中的聊天软件,你同时跟很多用户聊天,但不是你每次和某个用户的发送数据时都创建一个对象。而是多次公用一个对象,这就是使用了享元模式。
享元模式的组成元素:
享元接口:用于定义让具体享元实现的规范(定义方法)。
具体享元:实现享元接口。然后根据需要定义内蕴状态,可以是对象集合等等。就是共享的数据。然后定义一个外蕴状态。
定一个一个工厂方法,用户容纳各个具体享元元素,根据调用出需要返回合适的享元对象。
实例
抽象享元
public interface FlyWeight{
//提供给具体享元元素一个操作的方法,该方法是接收外蕴状态的
void operator();
//这里定义一个显示内蕴和外蕴状态的方法
void display();
}
定义具体享元元素A:
public class FlyWeightA implements FlyWeight{
//定义内蕴状态这里定一个从数据库查询出的集合
private List list;
//定义一个外蕴状态,用于接收外部的状态然后执行外部的特殊需求
private String outDesc;//可以根据自己的需求定义
public FlyWeightA(){
}
void operate(String outDesc){
this.outDesc = outDesc;
//通过内蕴和外蕴实现所需要的逻辑
sysout(outDesc);
}
void show(){
//输出内蕴和外蕴状态
}
}
定义具体享元元素B:
public class FlyWeightB implements FlyWeight{
//定义内蕴状态这里定一个从数据库查询出的集合
private List list;
//定义一个外蕴状态,用于接收外部的状态然后执行外部的特殊需求
private String outDesc;//可以根据自己的需求定义
public FlyWeightB(){
}
void operate(String outDesc){
this.outDesc = outDesc;
//通过内蕴和外蕴实现所需要的逻辑
sysout(outDesc);
}
void show(){
//输出内蕴和外蕴状态
}
}
定义工厂元素
public class FlyWeightFactory{
private HashTable hash = new HashTable ();
public FlyWeightFactory(){
//分别生成A和B对象然后放入hash中
}
public FlyWeight get(String key){
//根据不同的key返回所需要的FlyWeight
}
}
//然后进行调用
main(){
FlyWeightFactory factory = new FlyWeightFactory();
//生产A
FlyWeight aFlyWeight = factory.get("A");
aFlyWeight.operator("a access");
//生产b
FlyWeight aFlyWeight = factory.get("b");
aFlyWeight.operator("b access");
//生产A
FlyWeight aFlyWeight = factory.get("A");
aFlyWeight.operator("A access");
//实际上返回的还是第一个对象,只是可以外蕴不同罢了
}
享元模式一共包含2个重要概念,一个是内蕴状态和外蕴状态。两种状态的充当者你可以根据自己的需要进行实现。
内蕴状态表示多个对象共享的部分。
外蕴状态表示每个对象独有的状态部分。
如现实中的聊天软件,你同时跟很多用户聊天,但不是你每次和某个用户的发送数据时都创建一个对象。而是多次公用一个对象,这就是使用了享元模式。
享元模式的组成元素:
享元接口:用于定义让具体享元实现的规范(定义方法)。
具体享元:实现享元接口。然后根据需要定义内蕴状态,可以是对象集合等等。就是共享的数据。然后定义一个外蕴状态。
定一个一个工厂方法,用户容纳各个具体享元元素,根据调用出需要返回合适的享元对象。
实例
抽象享元
public interface FlyWeight{
//提供给具体享元元素一个操作的方法,该方法是接收外蕴状态的
void operator();
//这里定义一个显示内蕴和外蕴状态的方法
void display();
}
定义具体享元元素A:
public class FlyWeightA implements FlyWeight{
//定义内蕴状态这里定一个从数据库查询出的集合
private List list;
//定义一个外蕴状态,用于接收外部的状态然后执行外部的特殊需求
private String outDesc;//可以根据自己的需求定义
public FlyWeightA(){
}
void operate(String outDesc){
this.outDesc = outDesc;
//通过内蕴和外蕴实现所需要的逻辑
sysout(outDesc);
}
void show(){
//输出内蕴和外蕴状态
}
}
定义具体享元元素B:
public class FlyWeightB implements FlyWeight{
//定义内蕴状态这里定一个从数据库查询出的集合
private List list;
//定义一个外蕴状态,用于接收外部的状态然后执行外部的特殊需求
private String outDesc;//可以根据自己的需求定义
public FlyWeightB(){
}
void operate(String outDesc){
this.outDesc = outDesc;
//通过内蕴和外蕴实现所需要的逻辑
sysout(outDesc);
}
void show(){
//输出内蕴和外蕴状态
}
}
定义工厂元素
public class FlyWeightFactory{
private HashTable hash = new HashTable ();
public FlyWeightFactory(){
//分别生成A和B对象然后放入hash中
}
public FlyWeight get(String key){
//根据不同的key返回所需要的FlyWeight
}
}
//然后进行调用
main(){
FlyWeightFactory factory = new FlyWeightFactory();
//生产A
FlyWeight aFlyWeight = factory.get("A");
aFlyWeight.operator("a access");
//生产b
FlyWeight aFlyWeight = factory.get("b");
aFlyWeight.operator("b access");
//生产A
FlyWeight aFlyWeight = factory.get("A");
aFlyWeight.operator("A access");
//实际上返回的还是第一个对象,只是可以外蕴不同罢了
}
发表评论
-
多种单例模式的分析
2012-03-28 18:06 0blog.csdn.net/derpvailzhangfan/ ... -
JDK中的设计模式
2012-03-14 22:56 01.Abstract Factory •java.util.C ... -
简单工厂模式使用心得(使用场景)
2012-02-23 18:24 11483在实际项目中,简单工厂模式是我们使用的最多的设计模式之一,简单 ... -
AbstractList中Iterator模式的妙用
2012-01-13 11:51 943AbstractList中为了实现顺序访问AbstractLi ... -
适合使用命令模式的情景
2012-01-13 11:31 886情景1.当借个类都拥有 ... -
Iterator模式
2012-01-13 10:57 855我个人常叫它游标模式,该模式的主要目的就是,顺序访问集合中的各 ... -
使用工厂设计模式的场景
2012-01-12 15:43 2729创建类对象虽然可以使用new(底层也是通过反射创建对象的),但 ... -
JDK中使用的设计模式
2012-01-13 10:04 14151.抽象工厂模式 实 ... -
JDK中使用的设计模式代码实例
2012-01-05 17:38 0http://stackoverflow.com/questi ... -
策略模式
2011-12-22 17:07 838所谓策略模式就是定义了多种算法,而让不同算法之间的切换不会影响 ... -
合成设计模式
2011-12-22 16:28 942如果要将对象组织到树中,使用树来表示对象之间的关系,请考虑使用 ... -
责任链模式
2011-12-20 18:35 801此文转正于http://wenku.baidu.com/vie ... -
桥梁设计模式
2011-12-19 18:19 803如果有很多对象要处理,而又有很多操作要做。这时可以考虑使用桥梁 ... -
多线程设计模式(Thread-Specific storage)
2011-12-12 15:29 5818引用自http://www.riabook.cn/doc/de ... -
代理模式
2011-11-30 15:26 904代理模式实际上是对对象的一种代理,以控制对象的访问。 有些情况 ... -
观察者模式
2011-11-16 14:48 1368声明转载的,简单易懂,呵呵 观察者模式的构造 l 抽 ... -
命令模式
2011-11-16 14:11 1220今天想学学命令模式,看见了一个文章讲的就是命令模式,感觉实例比 ... -
建造模式
2011-11-14 12:03 879建造模式是将负责对象 ... -
设计模式之适配器模式
2011-11-09 18:24 933适配器模式:主要是为了解决,老的对象在新的环境中不兼容的现象。 ... -
设计模式之模版方法
2011-11-09 16:31 783模版方法是一种非常简单的设计模式:简单的理解就是将关键的业务方 ...
相关推荐
用享元模式分析并实现一个具体案例。在一家咖啡店中客户每买一杯咖啡,咖啡制做系统就相应地创建该杯咖啡的配料表,并将其发送给店内的咖啡制做机,咖啡制做机接收到系统发送的配料表后便开始制造客户所买的咖啡。...
在享元模式中可以共享的相同内容称为内部状态(Intrinsic State),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同...
享元模式的分析以及实际应用 1.前言 4 1.1 课题的研究背景 4 1.2 课题主要研究目标 4 2.相关技术简介 4 2.1Java简介 4 3. 享元模式介绍 5 3.1举例分析 5 3.2基本介绍 5 3.3享元模式的具体角色 5 4. 享元模式之借书...
设计模式的享元模式的例子,希望对大家有用~~~~~~~~
设计模式之享元模式 设计模式之享元模式 设计模式之享元模式
设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx
设计模式之享元模式的两种实现方式——单纯享元模式和复合享元模式,已经各种的UML类设计图
享元模式的示例代码和文档,学习享元模式的参考资料。
享元模式Demo
享元模式运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。
享元模式最适合于解决因创建大量类似对象而累及性能的问题,本文将来总结JavaScript设计模式编程中的享元模式使用,包括在DOM操作时的利用示例:
设计模式-享元模式(讲解及其实现代码)
Android享元模式Demo,同步文章地址:http://blog.csdn.net/qq_28690547/article/details/51144424
设计模式(C#)之享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度的对象。
C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)
设计模式面面观(14):享元模式(Facade Pattern)-结构型模式 http://blog.csdn.net/fanweiwei/archive/2008/04/25/2326692.aspx
java设计模式【之】享元模式【源码】【场景:多缓存可选模式】 /** * 享元模式(预加载单例) * “元” 理解为 “同一地址对象” * 运用共享技术,减少对象的创建,降低对象的数量,降低内存消耗,提高性能 * ...
设计模式中的享原模式技术入门,可用于各种说明场合,一看就会哦
享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。 享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是...