设计模式 之 享元

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


        还记得那年夏天一起在作文本上玩过的五子棋吗?五子棋是一种两人对弈的纯策略型棋类游戏,它起源于中国古代的传统黑白棋种之中的一个,不仅能增强思维能力,提高智力,并且富含哲理,有助于修身养性。
                                               

    假设我们要做一个五子棋游戏的程序,该怎么做呢?看看五子棋游戏中的棋子,就是“黑子”和“白子”两种类型,假设每次都创建一个新的对象实例,是不是太消耗系统内存了呢?以下就为大家解决这一问题


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;namespace 享元模式
{//抽象棋子类public abstract class AbstractChessman{//棋子坐标protected int x;protected int y;//棋子类别(黑|白)protected string chess;public AbstractChessman (string chess){this.chess = chess;}//点坐标设置public abstract void point(int x,int y);//显示棋子信息public void show(){Console.WriteLine(this.chess+ "("+this.x+","+this.y +")");}}//黑色棋子实现public class BlackChessman :AbstractChessman{public BlackChessman(): base("●"){Console.WriteLine("--BlackChessman Construction Exec!!!");}public override void point(int x,int y){this.x = x;this.y = y;this.show();}}//白色棋子实现public class WhiteChessman :AbstractChessman{public WhiteChessman(): base("○"){Console.WriteLine("--WhiteChessman Construction Exec!!!");}public override void point(int x, int y){this.x = x;this.y = y;this.show();}}//创建棋子工厂public class FiveChessmanFactory{//单例模式工厂private static FiveChessmanFactory fiveChessmanFactory = new FiveChessmanFactory();//缓存存放共享对象private Hashtable cache = new Hashtable();//私有化构造方法private FiveChessmanFactory(){ }//获得单例工厂public static FiveChessmanFactory getInstance(){return fiveChessmanFactory;}public AbstractChessman getChessmanObject(string c){//从缓存中获得棋子对象实例AbstractChessman abstractChessman = (AbstractChessman)this.cache[c];if (abstractChessman == null){//缓存中没有棋子对象实例信息,则创建棋子对象实例,并放入缓存switch (c){case "B":abstractChessman = new BlackChessman();break;case "W":abstractChessman = new WhiteChessman();break;default:break;}//为防止非法字符的进入,返回nullif (abstractChessman !=null){cache.Add(c, abstractChessman);}}return abstractChessman;}}class Program{static void Main(string[] args){//创建五子棋工厂FiveChessmanFactory fiveChessmanFactory = FiveChessmanFactory.getInstance();//随机数,用来生成棋子对象Random random = new Random();int radom = 0;AbstractChessman abstractChessman = null;for (int i = 0; i < 10; i++){radom = random.Next(2);switch (radom){case 0:abstractChessman = fiveChessmanFactory.getChessmanObject("B");break;case 1:abstractChessman = fiveChessmanFactory.getChessmanObject("W");break;}if (abstractChessman !=null){//设置棋子位置信息abstractChessman.point(i, random.Next(15));}}}}
}




享元模式类图:
                                        



在类图中包括例如以下几个角色:
        Flyweight(抽象享元角色):全部详细享元的超类,为详细享元类规定出须要实现的公共接口。
        ConcreteFlyweight(详细享元角色):实现抽象享元角色所规定的接口。假设有内含状态,则必须负责为内含状态提供存储空间。
        FlyweightFactory(享元工厂角色):负责创建和管理享元角色。必须保证享元对象能够被系统适当地共享。




主要长处:
        1.能够极大降低内存中对象的数量,使得同样或相似对象在内存中仅仅保存一份,从而能够节约系统资源,提高系统性能。
        2.享元模式的外部状态相对独立,并且不会影响其内部状态,从而使得享元对象能够在不同的环境中被共享。


主要缺点:
        1.享元模式使得系统变得复杂,须要分离出内部状态和外部状态,这使得程序的逻辑复杂化。
        2.为了使对象能够共享,享元模式须要将享元对象的部分状态外部化,而读取外部状态将使得执行时间变长。


适用场景:
        1.当系统中某个对象类型的实例较多的时候。
        2. 对象的大部分状态都能够外部化,能够将这些外部状态传入对象中。
        




相关的设计模式
        1.组合:能够使用享元共享组合中的叶子节点,从而提高系统的处理效率。
        2.单例:在享元中,一般都是想享元工厂设置为单例,以减少系统使用空间。单例本身就是一种享元!单例仅仅有一个对象实例,被其它对象所共享。









转载于:https://www.cnblogs.com/bhlsheji/p/4209208.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php制作简单的用户登陆,如何用php代码实现简单的用户登陆以及登陆验证功能

本文主要简单讲述了如何使用php实现简单的用户登陆以及登陆验证效果。1、首先实现通过Session实现用户的登录那么什么是session呢&#xff1f;session被译为会话&#xff0c;它主要是为了在一定访问期间在不同页面之间间传输数据&#xff0c;用来解决http协议无状态。session在…

纪事日记–可自定义的数据存储

总览 使任何数据结构或算法尽可能快的方法是使代码完全执行您想要的操作&#xff0c;而无需执行其他操作。 建立一个可以做任何人想做的每件事的数据存储的问题是&#xff0c;它做得不好。 自定义数据存储在性能方面可以实现什么&#xff1f; 您可以支持&#xff1b; 大约75纳…

php vprintf,vprintf - [ C语言中文开发手册 ] - 在线原生手册 - php中文网

格式-指向以空字符结尾的字符串的指针&#xff0c;指定如何解释数据。格式字符串由普通的多字节字符(&#xff05;除外)组成&#xff0c;它们被原样复制到输出流和转换规范中。每个转换规范具有以下格式&#xff1a;介绍&#xff05;字符(可选)一个或多个标志&#xff0c;用于修…

Quick cocos2dx-Lua(V3.3R1)学习笔记(十)-----搭建安卓打包环境,用官方示例anysdk生成apk运行...

话说我这一篇就写搭建打包安卓环境&#xff0c;是不是有点过早了&#xff08;其实我主要是怕以后重装系统&#xff0c;忘了怎么搭建了&#xff09;&#xff0c;但是迟早要面对的痛苦&#xff0c;一直延后也不是办法&#xff0c;对吧。 在官方文档中&#xff0c;对于打包安卓apk…

ejb运行程序_EJB程序化查找

ejb运行程序在上一篇文章中&#xff0c;我们了解了EJB 引用和EJB 注入 。 尽管EJB注入是一种强大的容器工具&#xff0c;可以简化模块化应用程序的开发&#xff0c;但有时还是希望执行程序化EJB查找。 例如&#xff0c;让我们假设一组不同的EJB实现由公共业务接口定义的公共策略…

php实现返回顶部,返回顶部js

返回顶部jsfunction goTopEx(){var objdocument.getElementById(“goTopBtn”);function getScrollTop(){return (document.documentElement.scrollTopdocument.body.scrollTop);}function setScrollTop(value){if(document.documentElement && document.documentEleme…

中国大学MOOC-数据结构基础习题集、06-2、旅游规划

题目链接&#xff1a;http://www.patest.cn/contests/mooc-ds/06-2 题目分析&#xff1a;陈姥姥说&#xff0c;这是Dijstra算法的一道题。题目是中文的&#xff0c;这里就不再啰嗦了。有一点提示一下&#xff0c;咱们平时用的Dijistra算法&#xff0c;是用来求最短路径的。这道…

我们正在下注:这个注解很快就会出现在JDK中

Yahor最近提出的Stack Overflow问题引起了我的兴趣&#xff1a; 如何在Java 8编译时确保方法签名“实现”功能接口 。 这是一个很好的问题。 让我们假设以下名义类型&#xff1a; FunctionalInterface interface LongHasher {int hash(long x); }该类型强加了清晰的合同。 实现…

java解码p7b证书文件,通过OpenSSL解码X509证书文件

在Windows平台下&#xff0c;如果要解析一个X509证书文件&#xff0c;最直接的办法是使用微软的CryptoAPI。但是在非Windows平台下&#xff0c;就只能使用强大的开源跨平台库OpenSSL了。一个X509证书通过OpenSSL解码之后&#xff0c;得到一个X509类型的结构体指针。通过该结构体…

php 网页手册模板,网站表单模板

前端界面默认网站表单模板介绍发布&#xff1a;/template/pc/default/home/form_post.html列表&#xff1a;/template/pc/default/home/form_list.html查看&#xff1a;/template/pc/default/home/form_show.html自定义网站表单模板介绍发布&#xff1a;/template/pc/default/h…

iOS安全攻防(三):使用Reveal分析他人app

使用Reveal分析他人app准备工作1&#xff09;已越狱的设备&#xff0c;而且已安装了OpenSSH,MobileSubstrate等有用工具(Cydia源里安装)2&#xff09;本地已安装了Reveal操作步骤1&#xff09;拷贝framework和dylib到越狱机scp -r /Applications/Reveal.app/Contents/SharedSup…

orm框架选型问题_ORM问题

orm框架选型问题在过去的几年中&#xff0c;像Hibernate这样的对象关系映射工具已经帮助开发人员在处理关系数据库方面获得了巨大的生产力增长。 ORM使开发人员可以专注于应用程序逻辑&#xff0c;并避免为诸如插入或查询之类的简单任务编写大量样板SQL。 但是&#xff0c;充分…

iwifi 命令

1&#xff1a; tftp -gr ctwancfg.html 192.168.1.18转载于:https://www.cnblogs.com/gavinwu/p/4221790.html

JBoss BPM Travel Agency演示与现代BPM数据集成

不久前&#xff0c;我们启动了一个规模较大的JBoss Travel Agency演示项目&#xff0c;以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 &#xff0c;不仅向您展示了如何安装它&#xff0c;项目中各种规则和流程工件的含义&#xff0c;还向您介绍了在实际使用…

京东php asp,jd jd demo 关于php的代码里面是 一些京东的接口 包含了 重要 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...

开发工具: PHP文件大小: 183 KB上传时间: 2013-04-15下载次数: 1详细说明&#xff1a;jd demo 关于php的代码里面是关于一些京东的接口里面的代码包含了一些重要-jd demo about php code jingdong interface文件列表(点击判断是否您需要的文件&#xff0c;如果是垃圾请在下面评…

scala入门-10 隐式转换、隐式参数、隐式类

到目前为止&#xff0c;隐式转换是scala的重点和难点了&#xff0c;加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子&#xff1a; 上面的例子中使用了隐式参数&#xff0c;我们也可以明显的指明参数&#xff1a; 下面看一下隐式类&#xff1a; 相当于&…

抢答网页PHP,[抢答]抢答环节已结束,相关答案已封箱 - 薅羊毛(Coupon)版 - 北大未名BBS...

mojave (你说得都对) 在 ta 的帖子中提到&#xff1a;抢答活动已经全部结束。截止目前&#xff0c;以下题目的正确答案不足5个&#xff1a;第9题、第22题、第23题等。封盘时间为今晚23:00。各位可以在封盘之前继续回答。另外我们提醒大家&#xff0c;如果一题中有多个回答&…

连载《一个程序猿的生命周期》-2.城市校园生活

一个程序猿的生命周期 微信平台 口 号&#xff1a;职业交流&#xff0c;职业规划&#xff1b;面对现实&#xff0c;用心去交流、感悟。 公众号&#xff1a;iterlifetime 百木-ITer职业交流奋斗 群&#xff1a;141588103 微 博&#xff1a;http://www.weibo.com/u/57234…

jvm锁_JVM如何处理锁

jvm锁当我们谈论最新版本的Sun Hotspot Java虚拟机1.6时&#xff0c;当您尝试从java.util.concurrent.locks.Lock实现获取锁或输入同步块时&#xff0c;JVM将执行以下三种锁类型&#xff1a; 有偏见的 &#xff1a;有时&#xff0c;即使在并发系统中也没有争用&#xff0c;并且…

excel使用MySQL数据,如何使用mysql完成excel中的数据生成

Excel是数据分析中最常用的工具&#xff0c;本篇文章通过mysql与excel的功能对比介绍如何使用mysql完成excel中的数据生成&#xff0c;数据清洗&#xff0c;预处理&#xff0c;以及最常见的数据分类&#xff0c;数据筛选&#xff0c;分类汇总&#xff0c;以及数据透视等操作。本…