享元模式(Flyweight)就是把部分和整体的关系用树形结构来表示,从而使客户端能够把一个个的部分对象和有他们组合起来的整体对象采用同样的方式看待,他也是一个继承的替代,其实具体的说,享元模式就是用时间交换了空间。用程序的运行速度来读取是否重复的对象内容,然后不创建一个重复的对象来节省空间,于此同时就大大提高了程序的运行效率。
下面就简单的原理图:
然后通过一个字符的库创建简单的理解了一下享元模式,我们要创建一个字符库,这样就避免不了一些字符使我们想重复用的,这样如果我们每次用都重新的创建一个对象,然后分配空间,那么对于好多重复的字符会明显的浪费空间,这个时候就引入了享元模式。
首先创建一个字符的接口,定义了一个负责拿到所在实例中的字符的方法getName();如下:
package coml.designpattern.flyweight;
public interface Characters {
public String getName();
}
紧接着定义了一个公用的子类实现了这个接口,书中是做了N个子类实现,这里我就用了一个子类,并在Flyweight种也有区别,个人觉得这样减少了代码的复用:
package coml.designpattern.flyweight;
public class Character implements Characters {
private String name;
public Character(String name) {
this.name = name;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return this.name;
}
}
然后在Flyweight中定义创建字符的具体的方法和相关的逻辑:
package coml.designpattern.flyweight;
import java.util.ArrayList;
import java.util.List;
public class Flyweight {
private List list = new ArrayList();
public Characters getCharacter(String name) {
Characters characters = null;
for (int i = 0; i < list.size(); i++) {
characters = (Characters) list.get(i);
if (name.equals(characters.getName())) {
System.out.println(name + "不是第一次使用,未分配空间");
break;
} else {
characters = null;
}
}
if (characters == null) {
characters = new Character(name);
System.out.println(name + "第一次使用,并分配空间");
list.add(characters);
}
return characters;
}
}
定义了一个list,每次有新对象的时候就放进去,然后每次调用GetCharacter时候都会去遍历整个list想要的对象有没有创建好,如果有就不再创建,如果没有在创建,书中这里是用了N个Characters的实现类,在if语句块里面定义了N中情况,每一个字符就是一个对象,我这里就一个实现类,然后用不同的引用而已, 其实效果是一样的,然后客户端的调用:
package coml.designpattern.flyweight;
public class Client {
public static void main(String[] args) {
Flyweight flyweight = new Flyweight();
Characters study1 = flyweight.getCharacter("study");
Characters pattern = flyweight.getCharacter("pattern");
Characters study2 = flyweight.getCharacter("study");
Characters java = flyweight.getCharacter("java");
Characters study3 = flyweight.getCharacter("study");
Characters js = flyweight.getCharacter("js");
System.out.println(study1.getName() + "\t" + java.getName() + "\t"
+ study2.getName() + "\t" + pattern.getName() + "\t"
+ study3.getName() + "\t" + js.getName() + "\t");
}
}
输出结果:
study第一次使用,并分配空间
pattern第一次使用,并分配空间
study不是第一次使用,未分配空间
java第一次使用,并分配空间
study不是第一次使用,未分配空间
js第一次使用,并分配空间
study java study pattern study js
这样发现study虽然使用了三次但是他只创建了一次,如果使用N次,那么会很明显的减少了空间的使用;
在数据库连接池就是实际中的应用,先创建好一个池,每次有人要取得数据不会再像JDBC一样创建一个新的连接,这样减少了服务器端的压力,提高了项目的性能;
使用享元模式可以大大节省空间,但是需要维护所有的享元对象,如果 要维护的享元很多,在查找的时候要消耗大量的时间,因此享元模式是典型的以时间来交换空间。
分享到:
相关推荐
设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx
设计模式(C#)之享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度的对象。
C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)
主要为大家详细介绍了C++设计模式之享元模式Flyweight,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
享元模式英文称为“Flyweight Pattern”,我非常感谢将Flyweight Pattern翻译成享元模式的那位强人,因为这个词将这个模式使用的方式明白得表示了出来;如果翻译成为羽量级模式或者蝇量级模式等等,虽然可以含蓄的...
C++设计模式课件13_Flyweight_享元模式.pdf
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第12节:结构型模式Flyweight享元模式
C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式)
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy...
FlyWeight享元 --- 对象结构型模式
主要介绍了C++设计模式编程的Flyweight享元模式结构,享元模式在实现过程中主要是要为共享对象提供一个存放的"仓库"(对象池),需要的朋友可以参考下
三、享元模式中主要角色 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态的操作可以通过调用商业以参数形式传入 具体享元(ConcreteFlyweight)角色:...
设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy...
主要介绍了Java设计模式之共享模式/享元模式(Flyweight模式)介绍,本文讲解了为什么使用共享模式/享元模式、如何使用共享模式/享元模式、Flyweight模式在XML等数据源中应用等内容,需要的朋友可以参考下
23种Python设计模式示例演示源码包,比如包括了工厂模式、Bridge桥接模式、Builder构建模式、Facade外观模式、Adapter适配器模式,Composite组合模式、Decorator装饰器模式,FactoryMethod工厂方法模式、Flyweight享...
结构模式:设计模式之Facade(外观),设计模式之Proxy(代理),设计模式之Adapter(适配器),设计模式之Composite(组合),设计模式之Decorator(油漆工),设计模式之Bridge,设计模式之Flyweight(享元). 行为模式:设计模式之...
C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式) C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式) ...
第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) ...