Ⅰ flyweight pattern翻译过来为什么是享元模式
享元(Flyweight)模式
1. Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级"。这里使用"享元模式"更能反映模式的用意。
2. Flyweight在拳击比赛中指最轻量级,即“蝇量级”,这里翻译为“享元”,可以理解为共享元对象(细粒度对象)的意思。提到Flyweight模式都会一般都会用编辑器例子来说明,这里也不例外。
享元模式以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。内蕴状态是存储在享元对象内部并且不会随环境改变而改变。因此内蕴状态并可以共享。外蕴状态是随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态与内蕴状态是相互独立的。享元模式的应用享元模式在编辑器系统中大量使用。一个文本编辑器往往会提供很多种字体,而通常的做法就是将每一个字母做成一个享元对象。享元对象的内蕴状态就是这个字母,而字母在文本中的位置和字模风格等其他信息则是外蕴状态。比如,字母a可能出现在文本的很多地方,虽然这些字母a的位置和字模风格不同,但是所有这些地方使用的都是同一个字母对象。
http://www.javaeye.com/wiki/topic/428368
http://ikoo.info/posts/flyweight-pattern/
Ⅱ 享元模式一般用在哪些方面
响应模式一般用在很好的地方,而且特别好用,我们都应该非常好理解。
Ⅲ 享元模式的介绍
享元模式(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
Ⅳ 享元模式为什么享元的是两个对象
享元模式可以理解成一组共享的对象集合,下面就是一个简单的享元设计模式(甚至可以说是工厂模式了,呵呵,工厂模式目的是将具体创建对象的过程由工厂方法提供,用户只需要知道抽象类型即可。但这个例子就不要纠结成工厂模式了)privateMapmap=newHashMappublicObjectget(Stringkey){if(map.containsKey(key)){returnmap.get(key);}Objectobj=newObject();map.put(key,obj);returnobj;}单例模式见下publicclassS{privatestaticSs=newS();privateS(){}publicstaticSgetInstance(){returns;}}从上面我们享元设计模式是一个类有很多对象,而单例是一个类仅一个对象;享元模式是为了节约内存空间,提升程序性能(避免大量的new操作);而单例模式则主要是出于共享状态的目的
Ⅳ 享元模式的示例
典型的享元模式的例子为文书处理器中以图形结构来表示字符。一个做法是,每个字形有其字型外观, 字模 metrics, 和其它格式资讯,但这会使每个字符就耗用上千字节。取而代之的是,每个字符参照到一个共享字形物件,此物件会被其它有共同特质的字符所分享;只有每个字符(文件中或页面中)的位置才需要另外储存。以下程式用来解释上述的文件例子。这个例子用来解释享元模式利用只载立执行立即小任务所必需的资料,因而减少内存使用量。
public enum FontEffect {
BOLD, ITALIC, SUPERSCRIPT, SUBSCRIPT, STRIKETHROUGH
}
public final class FontData {
/**
* A weak hash map will drop unused references to FontData.
* Values have to be wrapped in WeakReferences,
* because value objects in weak hash map are held by strong references. *
/
private static final WeakHashMap<FontData, WeakReference<FontData>> FLY_WEIGHT_DATA = new WeakHashMap<FontData, WeakReference<FontData>>();
private final int pointSize;
private final String fontFace;
private final Color color;
private final Set<FontEffect> effects;
private FontData(int pointSize, String fontFace, Color color, EnumSet<FontEffect> effects){ this.pointSize = pointSize;
this.fontFace = fontFace;
this.color = color;
this.effects = Collections.unmodifiableSet(effects);
}
public static FontData create(int pointSize, String fontFace, Color color, FontEffect... effects) { EnumSet<FontEffect> effectsSet = EnumSet.noneOf(FontEffect.class);
for (FontEffect fontEffect : effects) {
effectsSet.add(fontEffect);
}
// We are unconcerned with object creation cost, we are recing overall memory consumption FontData data = new FontData(pointSize, fontFace, color, effectsSet);
// Retrieve previously created instance with the given values if it (still) exists WeakReference<FontData> ref = FLY_WEIGHT_DATA.get(data);
FontData result = (ref != null) ? ref.get() : null; // Store new font data instance if no matching instance exists
if (result == null) {
FLY_WEIGHT_DATA.put(data, new WeakReference<FontData> (data));
result = data;
}
// return the single immutable with the given values
return result;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof FontData) {
if (obj == this) {
return true;
}
FontData other = (FontData) obj;
return other.pointSize == pointSize && other.fontFace.equals(fontFace) && other.color.equals(color) && other.effects.equals(effects);
}
return false;
}
@Override
public int hashCode() {
return (pointSize * 37 + effects.hashCode() * 13) * fontFace.hashCode();
}
// Getters for the font data, but no setters. FontData is immutable.
}
Ⅵ 享元模式的使用场景
如果一个应用程序使用了大量的对象,而这些对象造成了很大的存储开销的时候就可以考虑是否可以使用享元模式。
例如,如果发现某个对象的生成了大量细粒度的实例,并且这些实例除了几个参数外基本是相同的,如果把那些共享参数移到类外面,在方法调用时将他们传递进来,就可以通过共享大幅度单个实例的数目。
Ⅶ 享元模式和单例模式的区别
元模式
Class flyWeight
{
Object get(std::string key)
{
if(m_map.containsKey(key))
{
return m_map[key];
}
Object obj;
m_map.put_back(key, obj);
return obj;
}
private:
std::map<string, object> m_map;
};
从上面我们享元设计模式是一个类有很多对象,而单例是一个类仅一个对象;享元模式是为了节约内存空间,提升程序性能(避免大量的new操作);而单例模式则主要是出于共享状态的目的
Ⅷ 你熟悉的设计模式有哪些写出单例模式的实现代码
23个设计模式:
根据目的设计模式可以分为创造模式,结构模式和行为模式,创建模式用于处理对象的创建。结构模式用于处理类或对象的组合。
行为模式用于描述类或对象如何交互以及如何分配职责,创建模式用于处理对象的创建。主要包括以下五种设计模式:
工厂方法模式()
抽象工厂模式(AbstractFactoryPattern)
建造者模式(BuilderPattern)
原型模式(PrototypePattern)
单例模式(SingletonPattern)
结构模式用于处理类或对象的组合,包括以下七个设计模式:
适配器模式(AdapterPattern)
桥接模式(BridgePattern)
组合模式(CompositePattern)
装饰者模式(DecoratorPattern)
外观模式(FacadePattern)
享元模式(FlyweightPattern)
代理模式(ProxyPattern)
行为模式描述类或对象如何交互以及它们如何分配职责。它由以下11种设计模式组成:
责任链模式(Chain的ResponsibilityPattern)
命令模式(CommandPattern)
解释器模式(InterpreterPattern)
迭代器模式(IteratorPattern)
中介者模式(MediatorPattern)
备忘录模式(MementoPattern)
观察者模式(ObserverPattern)
状态模式(StatePattern)
策略模式(StrategyPattern)
模板方法模式(TemplateMethodPattern)
访问者模式(VisitorPattern)
单例模式实现1:
公共类Singleton{
类共享实例对象
私有静态单例;单例=零;
//私有构造函数
私有Singleton(){
系统。出去了。这是单例!!);
}
//获取单例方法
公共同步静态单例getInstance(){
//确定共享对象是否为空,如何空一个新对象
If(singleton==null){
singleton=newsingleton();
}
返回单例。
}
}
单例模式实现2:
公共类Singleton{
类共享实例对象实例化
=newSingleton();
//私有构造函数
私有Singleton(){
系统:出去了,这是单例!!);
}
//获取单例方法
公共静态单例getInstance(){
直接返回共享对象
返回单例。
}
}
(8)php享元模式扩展阅读:
注意事项:
设计模式主要分三个类型:创建型和行为型。
Singleton:确保一个类只有一个实例,并为其提供一个全局访问点
AbstractFactory:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。
FactoryMethod:定义一个用于创建对象的接口,并让子类决定实例化哪个类。工厂方法将类的实例化延迟到子类。
Builder:将复杂对象的构造与其表示分离,使相同的构造过程可以创建不同的表示。
Prototype:指定要使用Prototype实例创建的对象的类型,并复制该原型来创建一个新对象。
Composite:将对象组合成树状结构,以表示整体各部分之间的关系。组合使用户一致地使用单个对象和组合对象。
Facade:为子系统fa中的一组接口提供一致的接口。Ade提供了一个高级接口,使子系统更易于使用。
Proxy:为其他对象提供一个代理,以控制对该对象的访问
Adapter:将一个接口类转换为客户想要的另一个接口类。适配器模式使那些由于接口不兼容而无法一起工作的类一起工作。
Decrator:式比子类化更灵活,可以为对象动态添加一些额外的职责。
Bridge:模式将抽象部分与其实现部分分离,以便它们可以独立地更改。
Flyweight:享元模式
Ⅸ c++/java/c#请高手解惑,关于设计模式中“享元模式( Flyweight )”!
对文档编辑器,重点不是它内部状态的共享(字符基本特征),而是场景的共享,也就是你说的格式。
比方说:文档编辑器用BTree结构来管理内容,它会为你在文档中使用的每一种格式(字体、字号、粗斜、颜色等多项的组合)建立一个索引,为文档中格式相同的连续字块建立一个节点,每个节点指向一种格式索引。这样是不是节省的大量内存呢。
当然,我上面说的还是最简单的情况。事实上,我们将格式分为多级(比如将变化最小的字体作为第一级,变化较多的字号作为第二级,而将其它的作为第三级),每一级可以再建立索引,形成更加复杂的共享层次和共享组合。
而字块节点采用了BTree,利用B树的优点,能够进行快速查找、索引的建立、字块的归并。
下面的图可以帮你加深理解。
文本信息如下: