享元模式
- 1.什么是享元模式
- 2.享元模式的角色
- 3.模型
- 4.例子
- 4.1 背景
- 4.2 项目结构
- 4.3 例子说明
- 4.4 元数据
- 4.5 元数据管理类
- 4.6 使用者
- 4.7 结果
- 5.总结
23种设计模式
1.什么是享元模式
要理解享元模式首先需要理解什么是元数据。
元数据不没有准确的范围,或者准确的格式。只能是相对来说。
比如对于一篇文章,元数据可以是章节,可以是段落,可以是语句,可以是文字,可以是笔画,甚至可以是像素点。。
对于文章,很多文章有一些版本声明之类的而且每一个文章的声明都相同,那么版本声明的段落就是文章的一个元数据。。。
享元模式就是把元数据用完后存起来,因为是元数据,使用的频率比较高,创建一个元数据的难度较大。保存起来后,再次用到元数据时,就不用创建了,而是可以直接使用。
享元模式与原型模式的区别:
从某种意义上来说:享元模式和原型模式的原理相似。但是这两种模式的工作的尺度不同。
享元模式的尺度比较小,更专注于本质。原型模式的尺度较大,专注于复杂对象。
举个例子:
享元模式更多的用在字符串和字符这一层面。
原型模式更多的用在持有某个复杂页面的对象(或者数据对象)。
2.享元模式的角色
元数据:根据需求定义的元数据
元数据工厂:管理元数据的类
使用者:使用元数据的类
3.模型
间接关联
管理
关联 使用者 元数据 管理者
4.例子
4.1 背景
在Java程序中,每一个字符串都是全新的对象,即使内容相同,对象也不同。
所以字符串比较需要使用equals方法来比较,而equals方法比较的也只是对象的内容不是对象本身。
这也是Java没有全等于的操作符 ===
当然,基本类型是可以使用运算符直接比较的。
如果一个程序大量的使用字符串,那么Java虚拟机的动作也是非常的频繁,需要不停的进行垃圾回收等等。。
那么如何实现相同的字符使用相同的对象呢?
对于Java程序来说,引用远远的比new对象快,比new对象更划算(节省空间等等)
4.2 项目结构
4.3 例子说明
例子中包含2个享元模式的使用:
使用者—语句
语句—-字符
4.4 元数据
package flyWeight;
public class Word {
private char c;
public Word(char c){
this.c = c;
}
public char getChar(){
return c;
}
}
package flyWeight;
import flyweightfactory.WordFactory;
public class Statement {
private String message;
public Statement(String message){
this.message = message;
}
public String getMessage(){
return message;
}
public void sayMessage(){
for(int i = 0;i < message.length();i++){
System.out.println(WordFactory.getInstance().getWord(message.charAt(i)).getChar());
System.out.println(WordFactory.getInstance().getWord(message.charAt(i)));
}
}
}
4.5 元数据管理类
package flyweightfactory;
import java.util.HashMap;
import java.util.Map;
import flyWeight.Word;
public class WordFactory {
private static WordFactory factory = new WordFactory();
private static Map<Character, Word> map = new HashMap<Character, Word>();
private WordFactory(){
}
public static WordFactory getInstance(){
return factory;
}
public synchronized Word getWord(Character c){
if(map.containsKey(c)){
return map.get(c);
} else {
Word word = new Word(c);
map.put(c, word);
return word;
}
}
}
package flyweightfactory;
import java.util.HashMap;
import java.util.Map;
import flyWeight.Statement;
public class StatementFactory {
private static StatementFactory factory = new StatementFactory();
private Map<String, Statement> map = new HashMap<String, Statement>();
private StatementFactory(){
}
public synchronized Statement getStatement(String message){
if(map.containsKey(message)){
return map.get(message);
} else {
Statement statement = new Statement(message);
map.put(message, statement);
return statement;
}
}
public static StatementFactory getInstance(){
return factory;
}
}
4.6 使用者
package client;
import flyweightfactory.StatementFactory;
public class Main {
public static void main(String[] args) {
System.out.println("李明");
System.out.println("李明说:"
+ StatementFactory.getInstance().getStatement("你好")
.getMessage()
+ StatementFactory.getInstance().getStatement("你好"));
StatementFactory.getInstance().getStatement("你好").sayMessage();
System.out.println("小华");
System.out.println("小华说:"
+ StatementFactory.getInstance().getStatement("你好")
.getMessage()
+ StatementFactory.getInstance().getStatement("你好"));
StatementFactory.getInstance().getStatement("你好").sayMessage();
StatementFactory.getInstance().getStatement("这是长篇大论").sayMessage();
System.out.println("一起说:"
+ StatementFactory.getInstance().getStatement("你好")
.getMessage()
+ StatementFactory.getInstance().getStatement("你好"));
System.out.println("你要长长的,好好的");
System.out.println(StatementFactory.getInstance().getStatement("你要长长的,好好的").getMessage()+
StatementFactory.getInstance().getStatement("你要长长的,好好的"));
StatementFactory.getInstance().getStatement("你要长长的,好好的").sayMessage();
}
}
4.7 结果
李明
李明说:你好flyWeight.Statement@e53108
你
word.Word@1f33675
好
word.Word@7c6768
小华
小华说:你好flyWeight.Statement@e53108
你
word.Word@1f33675
好
word.Word@7c6768
这
word.Word@1690726
是
word.Word@5483cd
长
word.Word@9931f5
篇
word.Word@19ee1ac
大
word.Word@1f1fba0
论
word.Word@1befab0
一起说:你好flyWeight.Statement@e53108
你要长长的,好好的
你要长长的,好好的flyWeight.Statement@13c5982
你
word.Word@1f33675
要
word.Word@1186fab
长
word.Word@9931f5
长
word.Word@9931f5
的
word.Word@14b7453
,
word.Word@c21495
好
word.Word@7c6768
好
word.Word@7c6768
的
word.Word@14b7453
5.总结
享元模式使用得当可以增加性能。以最少的资源最快的速度实现需求。
所以能使用享元模式还是尽可能的使用享元模式。
23种设计模式