- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章php设计模式 FlyWeight (享元模式)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
享元模式英文称为“Flyweight Pattern”,我非常感谢将Flyweight Pattern翻译成享元模式的那位强人,因为这个词将这个模式使用的方式明白得表示了出来;如果翻译成为羽量级模式或者蝇量级模式等等,虽然可以含蓄的表现出使用此模式达到的目的,但是还是没有抓住此模式的关键。 享元模式的定义为:采用一个共享来避免大量拥有相同内容对象的开销。这种开销中最常见、直观的就是内存的损耗。享元模式以共享的方式高效的支持大量的细粒度对象。 在名字和定义中都体现出了共享这一个核心概念,那么怎么来实现共享呢?要知道每个事物都是不同的,但是又有一定的共性,如果只有完全相同的事物才能共享,那么享元模式可以说就是不可行的;因此我们应该尽量将事物的共性共享,而又保留它的个性。为了做到这点,享元模式中区分了内蕴状态和外蕴状态。内蕴状态就是共性,外蕴状态就是个性了。 注:共享的对象必须是不可变的,不然一变则全变(如果有这种需求除外)。 内蕴状态存储在享元内部,不会随环境的改变而有所不同,是可以共享的;外蕴状态是不可以共享的,它随环境的改变而改变的,因此外蕴状态是由客户端来保持(因为环境的变化是由客户端引起的)。在每个具体的环境下,客户端将外蕴状态传递给享元,从而创建不同的对象出来。 先看看下面程序,大概了解下享元模式。 。
复制代码代码如下
<?php /** * 享元模式 * * 运用享元技术有效的支持大量细粒度的对象 */ class CD { private $_title = null; private $_artist = null; public function setTitle($title) { $this->_title = $title; } public function getTitle() { return $this->_title; } public function setArtist($artist) { $this->_artist = $artist; } public function getArtist($artist) { return $this->_artist; } } class Artist { private $_name; public function __construct($name) { echo "construct ".$name."<br/>"; $this->_name = $name; } public function getName() { return $this->_name; } } class ArtistFactory { private $_artists = array(); public function getArtist($name) { if(isset($this->_artists[$name])) { return $this->_artists[$name]; } else { $objArtist = new Artist($name); $this->_artists[$name] = $objArtist; return $objArtist; } } } $objArtistFactory = new ArtistFactory(); $objCD1 = new CD(); $objCD1->setTitle("title1"); $objCD1->setArtist($objArtistFactory->getArtist('artist1')); $objCD2 = new CD(); $objCD2->setTitle("title2"); $objCD2->setArtist($objArtistFactory->getArtist('artist2')); $objCD3 = new CD(); $objCD3->setTitle("title3"); $objCD3->setArtist($objArtistFactory->getArtist('artist1')); 。
。
享元模式的精要有三点:
被系统大量使用的细粒度对象,粒度要有多细,量要有多大,看看jdk中使用的享元模式就知道了,jdk中,Integer,Character,String等都使用了享元模式,他们都是最基础的数据类型,不可谓不细,他们频繁的参与运算,不可谓不大量.
划分对象的内蕴属性/状态和外蕴属性/状态;所谓内蕴状态,就是存在对象的内部,不会随着环境变化的状态, 有一个网友说的很好,就是无区别的状态, 即拿掉外蕴属性之后同一类对象没有区别对象的内蕴状态就是对象的元神,只要元神元神无区别,那么对象也就无区别,同时也只有这些无区别的元神可以被共享,我想这也是Flyweight被翻译成享元的原因。外蕴状态就是由客户端指定,会随着环境变化的状态; 对于Integer来说, 他的内蕴属性其实就是他的value(当然它也没有外蕴属性),
用一个工厂控制享元的创造;因为享元对象不能被客户端随意创造, 否则就没有意义了。工厂通常提供缓存机制保存已经创造的享元.
面向对象虽然很好地解决了抽象性的问题,但是对于一个实际运行的软件系统,我们还需要考虑面向对象的代价问题,享元模式解决的就是面向对象的代价问题。享元模式采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力.
享元模式在一般的项目开发中并不常用,而是常常应用于系统底层的开发,以便解决系统的性能问题。Java和.Net中的String类型就是使用了享元模式。如果在Java或者.NET中已经创建了一个字符串对象s1,那么下次再创建相同的字符串s2的时候,系统只是把s2的引用指向s1所引用的具体对象,这就实现了相同字符串在内存中的共享。如果每次执行s1=“abc”操作的时候,都创建一个新的字符串对象的话,那么内存的开销会很大.
最后此篇关于php设计模式 FlyWeight (享元模式)的文章就讲到这里了,如果你想了解更多关于php设计模式 FlyWeight (享元模式)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
1、意图 运用共享技术有效的支持大量细粒度的对象 享元模式变化的是对象的存储开销 2、享元模式结构图 3、享元模式中主要角色 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超
享元模式英文称为“Flyweight Pattern”,我非常感谢将Flyweight Pattern翻译成享元模式的那位强人,因为这个词将这个模式使用的方式明白得表示了出来;如果翻译成为羽量级模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象 这种类型的设计模式属于结构型
这个问题已经有答案了: Run Jenkins job immediately (3 个回答) 已关闭 7 年前。 是否可以让我的工作作为“享元”工作执行,这样它就不会占用任何执行者? 最佳答案 任何
首先我将享元用于字符串,效果很好,但是当我将享元用于结构时。它不起作用。字符串的第一个测试用例是: static void testflyweightString() { char tmp[0]; v
我一直在阅读 boost::flyweight 的文档但我没有看到任何提及解除分配或引用计数政策。基本上,享元对象的行为应该像不同值的存储库,但不清楚当不再使用不同值时会发生什么。 是否已经支持?它可
使用 boost::flyweight 应该可以帮助我节省内存。我正在寻找对解决方案的有效性进行定量测量的方法。 有没有办法获取内部容器的 size()?如果它是基于散列的享元,有没有办法获取有关存储
这两种模式似乎达到了同样的目的。现实世界中有哪些不同的用例? 谢谢 最佳答案 Flyweight是当你有许多不同种类的单一事物时。 单例是当你有一个单一的东西。 例如,您可以使用享元模式来表示键盘字符
我想要一个 Flyweight 对象,因此我创建了一个对象并将其实例存储在 Map 中,如下所示: const FlyweightNumber = (function(){ "use stri
我正在开发一个新的应用程序,我将在其中同时打开一些窗口。我目前正在尝试设计 GUI,我正在为两种选择而苦苦挣扎: 我可以使用侧面导航面板并使用页面中心显示每个面板的内容。这些面板将根据享元模式存储,我
我的应用程序是多线程的,具有密集的字符串处理。我们正在经历过多的内存消耗,分析表明这是由于 String 数据造成的。我认为内存消耗会从使用某种享元模式实现甚至缓存中受益匪浅(我确信字符串经常重复,尽
我有一个关于享元选项的问题,给出下面的定义,基于 http://www.boost.org/doc/libs/1_40_0/libs/flyweight/test/test_basic.cpp typ
我无法理解如何将 boost::flyweight 用作 GOF 模式。有没有现成的例子? 例如,我希望它以下列方式使用。必须有一些享元容器,其中包含“胖”对象。这个容器可以为某些对象提供一些轻量级的
我正在尝试执行以下操作: boost::unordered_map, boost::flyweight > map; boost::flyweight foo(name);
我想知道为什么 std::map使用插入后不替换值。 示例: using std::string; using boost::flyweight; using std::map; int main()
所以我有一个字符串类型的享元: typedef boost::flyweight SymbolName_t; 我想将它的一个实例推送到它们的 vector 中,但天真的方法行不通: void Push
据我了解,享元设计模式与工厂或单例设计模式没有太大区别。 它只是一个生产不可变(和池化)对象的工厂。它只是一个单例,为(托管对象的)每种类型提供一个实例,而不是全局单个实例。 工厂和单例是创建模式,那
我的应用中有很多不同的屏幕一遍又一遍地引用相同的实体/业务对象。 目前,每个屏幕都引用每个对象的自己的拷贝。 此外,实体对象本身可能会公开对其他实体对象的访问,再次创建对象的新拷贝。 我正在尝试寻找缓
在打开 MFC 的情况下,在 VS2008 中编译以下代码时收到警告。 Boost 版本 1.39 include "boost/flyweight.hpp" include "boost/flywe
字符串已经在使用享元设计模式。汇集常见的 String 对象是否有益/性能好?因为字符串已经从字符串池中提取出来了吗? 最佳答案 字符串可以来自很多地方,默认情况下只有字符串文字在字符串池中。例如,当
我是一名优秀的程序员,十分优秀!