目录

  • 第二章 结构型模式
    • 1、结构型模式概述
    • 2、享元模式
      • (1)模式的定义与特点
      • (2)模式的结构与实现(Flyweight )
      • (3)应用场景
      • (4)扩展

第二章 结构型模式

1、结构型模式概述

结构型模式描述如何将类或对象按某种布局组成更大的结构。

  • 类结构型模式:采用继承机制来组织接口和类,
  • 对象结构型模式:采用组合或聚合来组合对象。
  • 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。

结构型模式分为以下7种:

  1. 代理(Proxy)模式:客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。

  2. 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

  3. 桥接(Bridge)模式:将抽象与实现分离,使他们可以独立的变化。用组合关系代替继承关系来实现,从而降低了抽象和实现这2个可变维度的耦合度。

  4. 装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能。

  5. 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口, 使这些子系统更加容易被访问。

  6. 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度 对象的复用

  7. 组合(Composite)模式将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。

注:以上7种结构型模式,除了适配器模式分为类结构型模式和对象结构型模式2种,其他的全部属于对象结构型模式。

2、享元模式

在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。

如:围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等等。这些对象有很多相似的地方,如果能把它们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生的背景。

(1)模式的定义与特点

  1. 定义
    运用共享技术来有效地支持大量细粒度对象的复用。
    它通过共享已经存在的对象来大幅度减少需要创建的对象数量避免大量相似对象的开销,从而提高系统资源的利用率。

  2. 优点
    (1)极大减少内存中相似或相同对象数量,节约系统资源,提供系统性能(缓存对象)
    (2)享元模式中的外部状态相对独立,且不影响内部状态(颜色的修改,不影响图形)

  3. 缺点
    为了使对象可以共享,需要将享元对象的部分状态外部化,分离内部状态和外部状态,使程序逻辑复杂

(2)模式的结构与实现(Flyweight )

享元(Flyweight )模式中存在以下两种状态:

  • 内部状态,即不会随着环境的改变而改变的可共享部分。
  • 外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。
  1. 结构
  • 抽象享元角色(Flyweight):
    (1)通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法这些方法可以向外界提供享元对象的内部数据(内部状态)
    (2)同时也可以通过这些方法来设置外部数据(外部状态)。

  • 具体享元(Concrete Flyweight)角色 :
    (1)它实现了抽象享元类,称为享元对象;
    (2)在具体享元类中为内部状态提供了存储空间。
    (3)通常我们可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。

  • 非享元(Unsharable Flyweight)角色 :
    (1)并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类
    (2)当需要一个非共享具体享元类的对象时可以直接通过实例化创建。

  • 享元工厂(Flyweight Factory)角色 :
    (1)负责创建和管理享元角色
    (2)当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;
    (3)如果不存在的话,则创建一个新的享元对象。

  1. 实现

例:俄罗斯方块
在俄罗斯方块这个游戏中,每个不同的方块都是一个实例对象,这些对象就要占用很多的内存空间,下面利用享元模式进行实现。

代码如下:
俄罗斯方块有不同的形状,我们可以对这些形状向上抽取出AbstractBox,用来定义共性的属性和行为。

抽象享元角色:AbstractBox

public abstract class AbstractBox {// 获取形状public abstract String getShape();// 显示图形及颜色,传递外部状态public void display(String color) {System.out.println("方块形状:" + this.getShape() + " 颜色:" + color);}
}

接下来就是定义不同的形状了,IBox类、LBox类、OBox类等。

具体享元角色

public class IBox extends AbstractBox {@Overridepublic String getShape() {return "I";}
}public class LBox extends AbstractBox {@Overridepublic String getShape() {return "L";}
}public class OBox extends AbstractBox {@Overridepublic String getShape() {return "O";}
}

提供了一个工厂类(BoxFactory),用来管理享元对象(也就是AbstractBox子类对象),该工厂类对象只需要一个,所以可以使用单例模式。并给工厂类提供一个获取形状的方法。

享元工厂:BoxFactory

public class BoxFactory {// 聚合享元角色private static HashMap<String, AbstractBox> map;// 在构造方法中初始化private BoxFactory() {map = new HashMap<String, AbstractBox>();AbstractBox iBox = new IBox();AbstractBox lBox = new LBox();AbstractBox oBox = new OBox();map.put("I", iBox);map.put("L", lBox);map.put("O", oBox);}//提供一个方法获取该工厂类对象public static BoxFactory getInstance() {return factory;}// 单例模式创建享元工厂private static BoxFactory factory = new BoxFactory();// 根据名称获取享元对象public AbstractBox getBox(String key) {return map.get(key);}
}

测试类:

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));}

(3)应用场景

  • 一个系统有大量相同或者相似的对象,造成内存的大量耗费。
  • 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
  • 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。

(4)扩展

Integer类使用了享元模式。我们先看下面的例子:

public class Demo {public static void main(String[] args) {Integer i1 = 127;Integer i2 = 127;System.out.println("i1和i2对象是否是同一个对象?" + (i1 == i2));Integer i3 = 128;Integer i4 = 128;System.out.println("i3和i4对象是否是同一个对象?" + (i3 == i4));}
}

运行上面代码,结果如下:

为什么第一个输出语句输出的是true,第二个输出语句输出的是false?

因为 Integer 默认先创建并缓存 -128 ~ 127 之间数的 Integer 对象,当调用 valueOf 时如果参数在 -128 ~ 127 之间则计算下标并从缓存中返回,否则创建一个新的 Integer 对象。

  • 单纯享元模式,这种享元模式中的所有的具体享元类都是可以共享的,不存在非共享的具体享元类

  • 复合享元模式,这种享元模式中的有些享元对象是由一些单纯享元对象组合而成的,它们就是复合享元对象。虽然复合享元对象本身不能共享,但它们可以分解成单纯享元对象再被共享

软件设计模式--第三章 结构型模式--享元模式相关推荐

  1. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  2. 设计模式(结构型)之享元模式(Flyweight Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  3. [设计模式] 结构型:享元模式(Flyweight Pattern)

    文章目录 什么是享元模式 设计与实现 Integer应用享元模式 什么是享元模式 "享"的意思是"共享","元"的意思是"对象&q ...

  4. 《精通Python设计模式》学习结构型之享元模式

    这个我日常当中也没有用到过, 真的是游戏行业用得多些? 学习一下, 有个印象. import random from enum import EnumTreeType = Enum('TreeTye' ...

  5. 23种设计模式(第三章结构型模式7种)

    结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦 ...

  6. 设计模式(三)结构型模式介绍及实例

    文章目录 一.适配器模式 1.1 适配器模式定义 1.2 适配器模式主要角色 1.3 适配器模式特点 1.4 适配器模式实现方式 1.4.1 类适配器模式 1.4.2 对象适配器模式 1.5 适配器模 ...

  7. 设计模式(三)结构型模式

    代理模式 装饰模式 适配器模式 组合模式 桥梁模式 外观模式 享元模式

  8. 【设计模式】 - 结构型模式 - 享元模式

    目录标题 前言 享元模式 概述 结构 实现:俄罗斯方块 优缺点和使用场景 JDK源码解析:Integer 前言 结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式 ...

  9. 设计模式(三)结构型模式(四)合成模式、享元模式

    写在前面: 你好,欢迎你的阅读! 我热爱技术,热爱分享,热爱生活, 我始终相信:技术是开源的,知识是共享的! 博客里面的内容大部分均为原创,是自己日常的学习记录和总结,便于自己在后面的时间里回顾,当然 ...

最新文章

  1. Synchronized和ReentranLock的区别
  2. GPU与CPU对比测试
  3. 限定虚拟机可用的CPU利用率
  4. Android中调用另一个Activity并返回结果-以模拟选择头像功能为例
  5. 用递归方法计算斐波那契数列(Recursion Fibonacci Sequence Python)
  6. RocketMQ消息的事务架构设计
  7. IDEA 载入jQuery的方法
  8. Android 系统性能优化(38)---Android内存优化之二:MAT使用进阶
  9. 电商促销页面需要的辅助图形给设计师准备好了,拿走!
  10. 把ts自动合并 下载网页视频并自动合成视频
  11. 青岛科技大学古典音乐考试需要的资料
  12. 【转】和老外聊天、发邮件常用英语缩写
  13. 手机qlv转mp4工具
  14. 安吉通Angton居家养老系统升级项目解决方案
  15. 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道
  16. 内网渗透(十三)之内网信息收集-收集域环境中的基本信息
  17. java计时器_Java实现的计时器【秒表】功能示例
  18. 软件工程小分队第一次会议
  19. ZT: 回顾2007:新兴网络服务汇总(完整篇)
  20. sfc 修复 xp rpc服务器,SFC—系统文件检查程序命令 System File Checker

热门文章

  1. 小米4配置fillder证书问题
  2. 基于JAVAMVC土特产交易平台系统计算机毕业设计源码+数据库+lw文档+系统+部署
  3. 非常暧昧的两个人(同事)关系突然就疏远
  4. java环境变量设置 win2003,2021-03-09Win10的Java环境配置Win10下Java环境变量配置
  5. 30岁学软件测试还来得及吗?
  6. 小学英语教学与计算机结合论文,小学英语教学与科技创新的结合
  7. 计网第六章.应用层各协议概览
  8. 《C++ 设计模式》
  9. 数据结构与算法--符号图
  10. 【天下手游】游戏角色分析