一、享元模式概述

  内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,可以通过享元模式,节省内存。

  享元模式核心:

    (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)的更多相关文章

  1. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  2. 设计模式-11享元模式(Flyweight Pattern)

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

  3. 二十四种设计模式:享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...

  4. 【GOF23设计模式】享元模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...

  5. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 【UE4 设计模式】享元模式 Flyweight Pattern

    概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...

  7. [设计模式] 11 享元模式 Flyweight

    转 http://blog.csdn.net/wuzhekai1985/article/details/6670298 问题 在面向对象系统的设计何实现中,创建对象是最为常见的操作.这里面就有一个问题 ...

  8. 设计模式 笔记 享元模式 Flyweight

    //---------------------------15/04/20---------------------------- //Flyweight 享元模式------对象结构型模式 /* 1 ...

  9. 【设计模式】—— 享元模式Flyweight

    前言:[模式总览]——————————by xingoo 模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是 ...

随机推荐

  1. BZOJ2259 [Oibh]新型计算机

    话说hzwer你在坑爹?... 我按照你的建图交了上去,发现WA. 开始检查= =...过了好久,突然觉得画风不对...hzwer您建图错了啊!!! 后来看了看zky的终于知道了怎么回事>_&l ...

  2. 030——VUE中鼠标语义修饰符

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. navicat for mysql 导入SQL Server显示中文乱码解决办法

    解决方法是在navicat里右击一个连接,选择连接属性,切换到高级选项卡,去掉“使用mysql字符集”前的对勾,在编码里选择utf-8

  4. Spring Framework Artifacts

    GroupId ArtifactId Description org.springframework spring-aop Proxy-based AOP support org.springfram ...

  5. L159

    Waves are the children of the struggle between ocean and atmosphere, the ongoing signatures of infin ...

  6. Linux:declare命令详解

    declare declare命令用于声明和显示已存在的shell变量.当不提供变量名参数时显示所有shell变量.declare命令若不带任何参数选项,则会显示所有shell变量及其值.declar ...

  7. 创建Azure scheduler完成日常任务

    Azure Scheduler 1. 登录portal,创建azure scheduler2. 选择任务类型.azure scheduler支持两种类型的任务.http :定时给一个url发请求sto ...

  8. Android Studio3.0 Kotlin工程问题集

    问题1: 新建支持Kotlin的Android项目,卡在"Resolve dependency :classpath" 解决分析: 一般碰到"Resolve depend ...

  9. windows 10 安装 sql 2005 安装失败

    windows 10 安装 sql 2005 安装失败 网上的方法记录: 安装中无法启动需要先用sp4的补丁文件sqlos.dll,sqlservr.exe 替换D:\Program Files (x ...

  10. 自己整合的SSM框架 maven坐标大全

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...