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 模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是 ...
随机推荐
- c# 使用SqlBulkCopy 提高大数据插入数据库速度
自己得一点总结: 1.BulkCopy采用的是插入方式,不是覆盖方式(原数据不动,在原数据的后面复制上dataTable中的内容) 2.自增的字段不用赋值 3.数据库字段名和dataTable列名可以 ...
- hdu2426
题解: KM模板题 如果n>m,输出-1 如果a[match[i]][i]==-1输出-1 负的边不用考虑 初始都赋值为-1 代码: #include<cstdio> #includ ...
- bzoj1997
题解: 在圆上面的点能不能不交叉 和那一题差不多 http://www.cnblogs.com/xuanyiming/p/8110597.html 代码: #include<bits/stdc+ ...
- js 时差转换 getTimezoneOffset()
如果我们的应用是针对世界各地的,当要把后台(服务器)存的时间展示给不同地区的用户时,这个时间应该经过时差转换. 转成用户客户端本地的时间,然后呈现给用户,即下面用到的getTimezoneOffset ...
- 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- (转)Mac os x 下配置Intellij IDEA + Tomcat 出现权限问题的解决办法
出现的错误提示如下: 下午9:11:27 All files are up-to-date下午9:11:27 All files are up-to-date下午9:11:27 Error runni ...
- LaText中插入带上下限的求和符号
效果如下: LaTex命令如下: \begin{equation} \label{8} z_{i}(k+1)=\sum_{j\in N_{i}(k)} a_{ij}(k)z_{i}(k),z_{i}( ...
- Linux下系统的定时及延时任务
一.系统的延时 是临时的.对系统做的任务指定一个时间点.发起的命令是at at 时间点(now+1min) ## 设定任务实行时间 at> 执行命令 ...
- vue中使用jquery插件
(1)使用npm下载安装依赖 直接npm install ‘插件名称’ --save 安装依赖 在main.js中引入插件的样式 在页面中直接使用 (2)直接将js文件引入到项目中 先将js文 ...
- [置顶]
Isolation Forest算法实现详解
本文算法完整实现源码已开源至本人的GitHub(如果对你有帮助,请给一个 star ),参看其中的 iforest 包下的 IForest 和 ITree 两个类: https://github.co ...