GOF23设计模式之享元模式(flyweight)
一、享元模式概述
内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,可以通过享元模式,节省内存。
享元模式核心:
(1)享元模式可以共享的、方式高效的支持大量细粒度对象的重用;
(2)享元对象能做到共享的关键是区分了内部状态和外部状态:
① 内部状态:可以共享,不会随环境变化而改变
② 外部状态:不能共享,会随环境变化而改变
二、享元模式实现
(1)FlyWeightFactory享元工厂类
创建并管理享元对象,享元池一般设计成键值对。
(2)FlyWeight抽象享元类
通常是一个接口,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。
(3)ConcreteFlyWeight具体享元类
内部状态提供成员变量进行存储。
(4)UnShareConcreteFlyWeight非共享享元类
不能被共享的子类可以设计成非共享享元类。
三、元模式场景导入示例代码
场景:围棋中每一个棋子都是一个对象。棋子有如下属性:
颜色 状态 大小(这些是可以共享的)称之为:内部状态
位置(这是不可以共享的)称之为:外部状态
/**
* 抽象享元类FlyWeight
* @author CL
*
*/
public interface ChessFlyWeight {
void setColor(String color);
String getColor();
void display(Coordinate c);
} /**
* ConcreteFlyWeight具体享元类
* 内部状态
* @author CL
*
*/
class ConcreteChess implements ChessFlyWeight { private String color; public ConcreteChess(String color) {
this.color = color;
} @Override
public void setColor(String color) {
this.color = color;
} @Override
public String getColor() {
return color;
} @Override
public void display(Coordinate c) {
System.out.println("棋子的颜色: "+color);
System.out.println("棋子的位置: ["+c.getX()+","+c.getY()+"]");
} }
import java.util.HashMap;
import java.util.Map; /**
* 享元工厂类
* @author CL
*
*/
public class ChessFlyWeightFactory {
//享元池
private static Map<String, ChessFlyWeight> map =
new HashMap<String, ChessFlyWeight>();; public static ChessFlyWeight getChess(String color) {
if (map.get(color) != null) {
return map.get(color);
} else {
ChessFlyWeight cfw = new ConcreteChess(color);
map.put(color, cfw);
return cfw;
}
} }
/**
* 外部状态
* UnShareFlyWeight非共享享元类
* @author CL
*
*/
public class Coordinate {
private int x, y; public Coordinate(int x, int y) {
this.x = x;
this.y = y;
} public int getX() {
return x;
} public void setX(int x) {
this.x = x;
} public int getY() {
return y;
} public void setY(int y) {
this.y = y;
}
}
测试:
/**
* 测试享元模式
* @author CL
*
*/
public class Client { public static void main(String[] args) {
ChessFlyWeight c1 = ChessFlyWeightFactory.getChess("黑色");
ChessFlyWeight c2 = ChessFlyWeightFactory.getChess("黑色");
System.out.println(c1);
System.out.println(c2); //c1 和 c2 是同一对象 System.out.println("--------------------");
c1.display(new Coordinate(10, 10));
c2.display(new Coordinate(20, 20));
} }
控制台输出:
com.caolei.flyweight.ConcreteChess@759ebb3d
com.caolei.flyweight.ConcreteChess@759ebb3d
--------------------
棋子的颜色: 黑色
棋子的位置: [10,10]
棋子的颜色: 黑色
棋子的位置: [20,20]
四、享元模式优缺点
优点:
(1)极大的减少内存中对象的数量;
(2)相同或相似对象内存中只存一份,极大的节约资源,提高系统性能;
(3)外部状态相对独立,不影响内部状态。
缺点:
(1)模式较复杂,使程序逻辑复杂化;
(2)为了节省内存,共享了内部状态,分离出外部状态,而读取外部状态使运行时间较长,用时间换空间。
五、享元模式常见开发应用场景
(1)享元模式由于其共享的特性,可以在任何“池”中操作,比如:线程池、数据库连接池;
(2)String类的设计也是享元模式;
(3)…………
GOF23设计模式之享元模式(flyweight)的更多相关文章
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- 设计模式-11享元模式(Flyweight Pattern)
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...
- 二十四种设计模式:享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...
- 【GOF23设计模式】享元模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...
- 设计模式之享元模式(Flyweight)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 【UE4 设计模式】享元模式 Flyweight Pattern
概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...
- [设计模式] 11 享元模式 Flyweight
转 http://blog.csdn.net/wuzhekai1985/article/details/6670298 问题 在面向对象系统的设计何实现中,创建对象是最为常见的操作.这里面就有一个问题 ...
- 设计模式 笔记 享元模式 Flyweight
//---------------------------15/04/20---------------------------- //Flyweight 享元模式------对象结构型模式 /* 1 ...
- 【设计模式】—— 享元模式Flyweight
前言:[模式总览]——————————by xingoo 模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是 ...
随机推荐
- BZOJ2259 [Oibh]新型计算机
话说hzwer你在坑爹?... 我按照你的建图交了上去,发现WA. 开始检查= =...过了好久,突然觉得画风不对...hzwer您建图错了啊!!! 后来看了看zky的终于知道了怎么回事>_&l ...
- 030——VUE中鼠标语义修饰符
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- navicat for mysql 导入SQL Server显示中文乱码解决办法
解决方法是在navicat里右击一个连接,选择连接属性,切换到高级选项卡,去掉“使用mysql字符集”前的对勾,在编码里选择utf-8
- Spring Framework Artifacts
GroupId ArtifactId Description org.springframework spring-aop Proxy-based AOP support org.springfram ...
- L159
Waves are the children of the struggle between ocean and atmosphere, the ongoing signatures of infin ...
- Linux:declare命令详解
declare declare命令用于声明和显示已存在的shell变量.当不提供变量名参数时显示所有shell变量.declare命令若不带任何参数选项,则会显示所有shell变量及其值.declar ...
- 创建Azure scheduler完成日常任务
Azure Scheduler 1. 登录portal,创建azure scheduler2. 选择任务类型.azure scheduler支持两种类型的任务.http :定时给一个url发请求sto ...
- Android Studio3.0 Kotlin工程问题集
问题1: 新建支持Kotlin的Android项目,卡在"Resolve dependency :classpath" 解决分析: 一般碰到"Resolve depend ...
- windows 10 安装 sql 2005 安装失败
windows 10 安装 sql 2005 安装失败 网上的方法记录: 安装中无法启动需要先用sp4的补丁文件sqlos.dll,sqlservr.exe 替换D:\Program Files (x ...
- 自己整合的SSM框架 maven坐标大全
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...