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 模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是 ...
随机推荐
- 缓存LruCache简单创建和使用
LruCache一般使用: /** * 总容量为当前进程的1/8,单位:KB * sizeOf():计算缓存对象的大小,单位要一致 * entryRemoved():移除旧缓存时调用 */ int m ...
- Struts13---Ognl
模拟初始化的jsp页面 <body> <a href="user/login">登录</a> </body> public clas ...
- flume 启动,停止,重启脚本
#!/bin/bash #echo "begin start flume..." #flume的安装根目录(根据自己情况,修改为自己的安装目录) path=/sysware/apa ...
- Javascript-- jQuery动画篇(淡入淡出效果)
淡入淡出效果 jQuery 提供了下面几种方法可以实现显示的淡入淡出效果: fadeIn() fadeOut() fadeToggle() fadeTo() fadeIn()方法 fadeIn()实现 ...
- PriorityBlockingQueue用法
摘自<Java编程思想> package com.test.concurrency; import java.util.ArrayList; import java.util.List; ...
- Flask框架中特有的变量/函数及上下文
模板中特有的变量和函数 你可以在自己的模板中访问一些 Flask 默认内置的函数和对象 config 你可以从模板中直接访问Flask当前的config对象: {{config.SQLALCHEMY_ ...
- visual studio 调试时提示 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。
问题描述 “Win32Project3.exe”(Win32): 已加载“D:\software\VS2013\VS2013 文档\Win32Project3\Debug\Win32Project3. ...
- three.js入门系列之粒子系统
其实代码很简单,也很容易懂(我用的是r99版本的three.js,目前网上大多数demo是60或者80的版本,其中的一些api已经废弃,如下是r99版本支持的写法): 注:渲染器是WebGl渲染器 如 ...
- Openlayers3中实现地图的切割
概述: 本文讲述如何在Openlayers3中结合canvas实现对地图的切割. 效果: 全图 切割北京区域 切割河北区域 实现: <html xmlns="http://www.w3 ...
- @media 照成的问题
多出很大的空白, 原因: left 进行了叠加. 解决办法: 即,不在media里写,将其写在box下