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

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

23种设计模式

    原文作者:算法小白
    原文地址: https://blog.csdn.net/a18792721831/article/details/85132777
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞