0
点赞
收藏
分享

微信扫一扫

23种设计模式----享元模式----结构型模式


享元模式

  • ​​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 项目结构

23种设计模式----享元模式----结构型模式_结构型模式

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.总结

享元模式使用得当可以增加性能。以最少的资源最快的速度实现需求。
所以能使用享元模式还是尽可能的使用享元模式。


举报

相关推荐

0 条评论