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

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

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

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

这就是享元模式。

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

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

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

抽象享元类:

 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. element table初始化默认选中以及切换页码的时候保留选中状态

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- impor ...

  2. 最近开始学习python,学习到了关于web的内容。

    然而在win10中IIS发布CGI脚本的时候遇到了各种各样的问题. 如ISAPI和CGI限制,权限限制等等,一一的百度解决了,最后又出现了 HTTP 错误 502.2 - Bad Gateway Th ...

  3. VMware Workstation 10 简体中文安装教程

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 分享到 一键分享 QQ ...

  4. 在 U-BOOT 对 Nand Flash 的支持

    1.1    U-BOOT 对从 Nand Flash 启动的支持 1.1.1   从 Nand Flash 启动 U-BOOT 的基本原理 1. 前 4K 的问题 如果 S3C2410 被配置成从 ...

  5. 自定义Jquery:ajax,get,post方法

    var myAjax = { request: function(url, type, data, callback) { $.ajax(url, { type: type, data: data, ...

  6. https://webpack.js.org/plugins/

    有问题还是看源码 ,看官方文档吧,整一晚上终于整明白了

  7. Android开发 MediaRecorder使用Camera2配合录制视频(暂时有异常抛出,无法使用)

    前言 这个博客本来是用来详细介绍MediaRecorder与Camera2,但是出乎预料之外,在获取mMediaRecorder.getSurface();的时候无论如何都是报错的,报错为Surfac ...

  8. bzoj1433 假期的宿舍

    题意:给你一些人可以睡某某人的床,问是否有所有人都睡下的方案?n<=50. 二分图最大匹配. 用邻接矩阵比较舒服. 标程: #include<cstdio> #include< ...

  9. light oj 1098 数学规律

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> ...

  10. Bitcoin 的基本原理

    昨天读到了 Bitcoin 的中文介绍,觉得非常有意思.不过上面这篇文章解释的非常不靠谱,我花了一晚上去Bitcoin的官方网站 仔细研究了一下,总算理解了其原理.感觉非常有启发,尤其是对虚拟货币的流 ...