设计模式 结构型模式 -- 享元模式(定义 示例 优缺点分析 使用场景)
Posted Z && Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 结构型模式 -- 享元模式(定义 示例 优缺点分析 使用场景)相关的知识,希望对你有一定的参考价值。
1. 享元模式
1.1 享元模式概述
动机:
字符享元对象示意图:
分析:
原理:
1.2 享元模式定义
1.3 享元模式结构
角色:
功能:
1.3.1 典型的抽象享元类代码
1.3.2 典型的具体享元类代码
1.3.3 典型的非共享具体享元类代码
1.3.4 典型的享元工厂类代码
1.4【例】俄罗斯方块
下面的图片是众所周知的俄罗斯方块中的一个个方块,如果在俄罗斯方块这个游戏中,每个不同的方块都是一个实例对象,这些对象就要占用很多的内存空间,下面利用享元模式进行实现。
先来看类图:
AbstractBox :
package com.tian.flyweight;
/**
* @version v1.0
* @ClassName: AbstractBox
* @Description: 抽象享元角色
*/
public abstract class AbstractBox {
//获取图形的方法
public abstract String getShape();
//显示图形及颜色
public void display(String color) {
System.out.println("方块形状:" + getShape() + ", 颜色:" + color);
}
}
IBox:
package com.tian.flyweight;
/**
* @version v1.0
* @ClassName: IBox
* @Description: I图形类(具体享元角色)
*/
public class IBox extends AbstractBox {
public String getShape() {
return "I";
}
}
LBox :
package com.tian.flyweight;
/**
* @version v1.0
* @ClassName: IBox
* @Description: L图形类(具体享元角色)
*/
public class LBox extends AbstractBox {
public String getShape() {
return "L";
}
}
OBox:
package com.tian.flyweight;
/**
* @version v1.0
* @ClassName: IBox
* @Description: O图形类(具体享元角色)
*/
public class OBox extends AbstractBox {
public String getShape() {
return "O";
}
}
BoxFactory:
package com.tian.flyweight;
import java.util.HashMap;
/**
* @version v1.0
* @ClassName: BoxFactory
* @Description: 享元工厂类:将该类设计为单例
*/
public class BoxFactory {
private HashMap<String, AbstractBox> map;
//在构造方法中进行初始化操作
private BoxFactory() {
map = new HashMap<String, AbstractBox>();
map.put("I", new IBox());
map.put("L", new LBox());
map.put("O", new OBox());
}
//提供一个方法获取该工厂类对象
public static BoxFactory getInstance() {
return factory;
}
private static BoxFactory factory = new BoxFactory();
//根据名称获取图形对象
public AbstractBox getShape(String name) {
return map.get(name);
}
}
Client :
package com.tian.flyweight;
/**
* @version v1.0
* @ClassName: Client
* @Description: 客户端类:测试类
*/
public class Client {
public static void main(String[] args) {
//获取I图形对象
AbstractBox box1 = BoxFactory.getInstance().getShape("I");
box1.display("灰色");
//获取L图形对象
AbstractBox box2 = BoxFactory.getInstance().getShape("L");
box2.display("绿色");
//获取O图形对象
AbstractBox box3 = BoxFactory.getInstance().getShape("O");
box3.display("灰色");
//获取O图形对象
AbstractBox box4 = BoxFactory.getInstance().getShape("O");
box4.display("红色");
System.out.println("两次获取到的O图形对象是否是同一个对象:" + (box3 == box4));
}
}
1.4.1 运行结果:
1.5 优缺点和使用场景
1.5.1 优点
- 极大减少内存中相似或相同对象数量,节约系统资源,提供系统性能
- 享元模式中的外部状态相对独立,且不影响内部状态
1.5.2 缺点
为了使对象可以共享,需要将享元对象的部分状态外部化,分离内部状态和外部状态,使程序逻辑复杂
1.5.3 使用场景
- 一个系统有大量相同或者相似的对象,造成内存的大量耗费。
- 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
- 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。
以上是关于设计模式 结构型模式 -- 享元模式(定义 示例 优缺点分析 使用场景)的主要内容,如果未能解决你的问题,请参考以下文章