(使用共享对象可有效地支持大量的细粒度的对象。)

  假设开发一个围棋程序,围棋程序的围棋的棋子包含了颜色、大小、位置等信息。在定义一个棋盘容器来存放这些棋子。 我们可以发现,棋盘的成员变量包含了一个棋子所有的属性,我们需要为每一个颜色大小开辟内存来储存这些信息,而一盘棋需要上百个棋子,这种实现方法占得空间太大了。

我们可以发现棋子的颜色形状等信息都是相同的,我们称这些是可以共享的属于内在的属性,还有位置信息无法共享称为外在属性

因此,可以这样设计,只需定义两颗棋子对象,一颗黑棋与一颗白棋,者两个对象包含棋子得到内在属性。再将外在属性(位置)提取出来放在单独的容器中。

这就是享元模式。

享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池,用来存储具有相同内部状态的享元对象。

单纯享元结构: 所有的享元对象都是可以共享的。

复合享元模式:将一些单纯享元使用合成模式加以复合,形成复合享元对象。这样的复合享元对象本身不能共享,但是他们可以分解成单纯享元对象,而后者则可以共享。

抽象享元类:

 public abstract class Flyweight {
private String shape = null;
private String color = null;
private int size = 0; public Flyweight(String shape, String color, int size) {
super();
this.shape = shape;
this.color = color;
this.size = size;
} public String getShape() {
return shape;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
} public void setShape(String shape) {
this.shape = shape;
} public int getSize() {
return size;
} public void setSize(int size) {
this.size = size;
} public abstract void show(String externstate);
}

具体享元类:

 public class ConcreteFlyweight extends Flyweight{

     public ConcreteFlyweight(String shape, String color, int size) {
super(shape, color, size); } @Override
public void show(String externstate) {
System.out.println("color:"+getColor());
// System.out.println(" shape:"+getShape()+" size:"+getSize());
System.out.println(" 外部状态: "+externstate);
} }

享元工厂类:

 import java.util.HashMap;
import java.util.Map; public class FlyweightFactory {
private static FlyweightFactory flyweightFactory = new FlyweightFactory();
private static final String white = "white";
private static final String black = "black";
private static Map<String,Flyweight> map = new HashMap<String, Flyweight>();
private FlyweightFactory() {
System.out.println("构造方法被调用!");
}
static public FlyweightFactory getInstance() {
return flyweightFactory;
}
static public Flyweight getFlyweight(String key) {
if (map.get(key)!=null) {
return map.get(key);
}
else if (key.equals(white)) {
//不可将初始化棋子放入构造器 会造成指针混乱
map.put(white,new ConcreteFlyweight("圆", "white", 5));
return map.get(key);
}else if (key.equals(black)) {
map.put(black,new ConcreteFlyweight("圆", "black", 5));
return map.get(key);
}{
System.out.println("无此享元对象");
return null;
} }
}

用户测试类:

 public class FlyweightPattern {

     public static void main(String[] args) {

      FlyweightFactory flyweightFactory =   FlyweightFactory.getInstance();
//可以将此对象的引用传入容器再在容器内添加位置信息,容器内只是引用有多份,而占内存的棋子只有一个黒子一个白子
Flyweight f1 = flyweightFactory.getFlyweight("white");
f1.show("x = 1,y = 2");//
Flyweight f2 = flyweightFactory.getFlyweight("black");
f2.show("x = 2,y = 3");
} }

享元模式(Flyweight、FlyweightFactory)(围棋棋子共享)的更多相关文章

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

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

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

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

  3. 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  4. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

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

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

  6. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...

  7. 享元模式-Flyweight(Java实现)

    享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...

  8. Java享元模式(Flyweight Pattern)

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

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

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

随机推荐

  1. Vue项目组织规范

    目录 一.项目结构的核心思想 二.项目目录结构 三.资源路径编译规则 四.index.html 五.build目录 和 config目录 六.public目录 七.static 目录 八.src目录结 ...

  2. Spring+SpringMVC+Mybatis搭建的网站的处理流程总结

    最近学习了如何使用SSM框架搭建网站,以前没用过框架,第一次使用,总结一下自己对框架处理流程的理解

  3. 02-python 学习第二天

    今天学习了以下几个方面的内容,虽然部分内容不能理解,跟着老师写出了代码. 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 程序练习1:购物车程序 请闭眼写出以下程序. 程序: ...

  4. WPF DataGridTextColum 显示时间格式化

    <DataGrid Name="DGVisit" Grid.Row="2" AutoGenerateColumns="False" C ...

  5. mac brew 安装 php 环境

    548  brew search php 549  brew tap homebrew/dupes 550  brew tap josegonzalez/homebrew-php 551  brew ...

  6. PCA降维2

    前言 本文为模式识别系列第一篇,主要介绍主成分分析算法(Principal Component Analysis,PCA)的理论,并附上相关代码.全文主要分六个部分展开: 1)简单示例.通过简单的例子 ...

  7. axios——post请求时把对象obj数据转为formdata格式

    转载自:https://blog.csdn.net/feizhong_web/article/details/80514436  在调用后台接口的时候,上传报名信息,利用axios 的post请求,发 ...

  8. Android开发 MediaPlayer将视频播放时尺寸适配完美

    前言 视频播放有一个较为蛋疼的问题,那就是尺寸适配.如果不做尺寸适配视频将会变形拉伸或者压缩.下面我就介绍个人实现的算法. 满足一边的算法 满足一边?你可能是疑问是什么意思.意思是就是始终将视频的高度 ...

  9. 【JZOJ3337】wyl8899的TLE

    description wyl8899今天也很刻苦的在做老师布置下来的题目! 这一天老师布置的题目是这样的: 给出两个仅含小写字母的字符串A和B,输出最大的k,使得A[1..k]是B的子串. A和B的 ...

  10. 12DUILib经典教程(实例)

    Duilib经典实例教程:1基本框架:一个简单的Duilib程序一般是下面这个样子的:://Duilib使用设置部分:#pragmaonce:#defineWIN32_LEAN_AND_ME:#def ...