享元模式FlyWeight

场景:如果有很多个完全相同或者相似的对象,可以节省内存资源

核心:

享元模式以共享的方式高效地支持大量细粒对象的重用

享元对象做到共享的关键是区分了内部状态和外部状态:

内部状态:可以共享,不会随环境变化而变化(共有的部分)

外部状态:不可以共享,会随环境变化而改变(独特的部分)

享元模式的实现:

-FlyweightFactory享元工厂类:创建并管理享元对象,享元池一般设计成键值对

-FlyWeight抽象享元类 :通常是一个接口或抽象类 声明公共方法,这些方法可以向外界提供对象的内部状态 设置外部状态

-ConcreteFlyWeight具体享元类:为内部状态提供成员变量进行储存

-UnsharedConcreteFlyWeught非共享享元类:不能被共享的子类可以设计成非共享享元类

在实际中的场景:线程池,数据库连接池,String类

优点:极大减少内存中对象的数量;相同或者相似的对象只存一份,节约资源;外部状态相对独立,不影响内部状态

缺点:模式复杂,程序逻辑复杂化;为了节省内存,共享了内部状态,分理出外部状态,读取外部状态使运行时间变长,时间换取空间

例如:围棋(内部状态:颜色形状大小  外部状态:位置)

/**
 * 外部状态类UnsharedConcreteFlyWeight
 * @author 小帆敲代码
 *
 */
public class Point {
 private int x;
 private int y;
 
public Point(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 小帆敲代码
 *
 */
public interface Chess {
  void setColor(String color);
  String getColor();
  void display(Point p);
}
class ConcreteChess implements Chess{
  private String color;
  
 public ConcreteChess(String color) {
   this.color = color;
  }
 @Override
 public void setColor(String color) {
  this.color=color;
 }
 @Override
 public String getColor() {
  return this.color;
 }
 @Override
 public void display(Point p) {
  System.out.println(color+"棋"+"在("+p.getX()+","+p.getY()+")点显示");
 }
}
/**
 * 享元工厂
 * @author 小帆敲代码
 *
 */
public class FlyWeightFactory {
  //享元池
 private static  Map<String,Chess> map=new HashMap<String,Chess>();
 public static Chess getChess(String color) {
  if(!map.containsKey(color)) {
   map.put(color, new ConcreteChess(color));
  }
  return map.get(color);
 }
}
public class Client {
  public static void main(String[] args) {
     Chess c1=FlyWeightFactory.getChess("黑");
     Chess c2=FlyWeightFactory.getChess("黑");
     System.out.println(c1);
     System.out.println(c2);
     System.out.println("增加外部状态-----");
     c1.display(new Point(10,10));
     c2.display(new Point(15,15));
  }
}

设计模式之GOF23享元模式的更多相关文章

  1. Java设计模式之《享元模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...

  2. 面向对象设计模式之Flyweight享元模式(结构型)

    动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同 时,让外部客户程序仍然能够透明地使用面向对象的 ...

  3. 设计模式学习之享元模式(Flyweight,结构型模式)(20)

    转:http://terrylee.cnblogs.com/archive/2006/03/29/361767.html 摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是 ...

  4. 设计模式学习心得<享元模式 Flyweight>

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...

  5. C#设计模式之十一享元模式(Flyweight Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第六个模式,该模式是[享元模式],英文名称是:Flyweight Pattern.还是老套路,先从名字上来看看.“享元”是不是可以这样理解,共享“单元”,单元 ...

  6. Java设计模式学习记录-享元模式

    前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...

  7. 设计模式(11)--Flyweight(享元模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 2.模式特点: 享元模 ...

  8. 设计模式之flyweight享元模式

    运用共享技术支持大量细粒度对象的使用 Flyweight模式(享元) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模 ...

  9. 大话设计模式Python实现- 享元模式

    享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象. 下面是一个享元模式的demo: #!/usr/bin/env python # -*- coding:utf- ...

随机推荐

  1. [源码分析] 带你梳理 Flink SQL / Table API内部执行流程

    [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 目录 [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 0x00 摘要 0x01 Apac ...

  2. 小白初学Java的一点点收获

    作为刚刚学习Java没有几天的小白,我想把我在学习过程中,所学习到的知识和注意事项和大家一起分享分享.在这个过程中,希望大家可以有所收获,有什么不对的地方,希望大家指出并且私信我. 首先说说第一次记事 ...

  3. Pytorch实现的语义分割器

    使用Detectron预训练权重输出 *e2e_mask_rcnn-R-101-FPN_2x* 的示例 从Detectron输出的相关示例 使用Detectron预训练权重输出 *e2e_keypoi ...

  4. 必应每日图片api

    https://cn.bing.com/HPImageArchive.aspx?format=xml&cc=jp&idx=0&n=1 format   = 'xml' | 'j ...

  5. 3.k均值的算法

    一.课堂练习 # 课堂练习 from sklearn.datasets import load_iris # 导入鸢尾花数据 iris=load_iris() iris iris.keys() dat ...

  6. (第九篇)Iptables详解

    常见的网络攻击形式 1.拒绝服务攻击:DOS 2.分布式拒绝服务攻击 DDOS 3.漏洞入侵 4.口令猜测 以上内容简单了解,具体可自行百度,此处不必知晓. Linux防火墙基础 Linux防火墙体系 ...

  7. IDEA设置导入主题样式皮肤,加入背景图片

    主题下载地址:http://www.riaway.com/theme.php 里面有很多主题,看个人喜好,这里我用的Monokai Sublime Text 3. 导入主题打开IDEA,找到File ...

  8. vue2.x学习笔记(二十七)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12682364.html. 单元测试 vue cli拥有开箱即用的通过jest或mocha进行单元测试的内置选项.官 ...

  9. 配置路由器/交换机的Telnet登录

    实验目的:给配置路由器/交换机管理IP地址.设置Telnet的登录帐号.密码. 第一步:配置路由器的名称.接口IP地址. Switch> Switch>en Switch# Switch# ...

  10. Linux分类

    Linux versions:http://www.cnblogs.com/sammyliu/articles/4832157.html1. Maintained by organization- D ...