`

设计模式回顾之十四:享元模式(Flyweight)

 
阅读更多

设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。

------------------------------------------------

享元模式(Flyweight) 

运用共享技术有效地支持大量细粒度的对象。

适用于:

一个应用程序使用了大量的对象,完全由于使用大量的对象,造成很大的存储开销。

对象的大多数状态都可变为外部状态。

如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。

应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

 

程序实现:

下面的程序举个例子,把祝福短信存储在手机里面,在需要发送的时候只要后面加上名字就行了(不知是否恰当)。

抽象类:

//Flyweight
public abstract class SMS {
	abstract public void sendMessage(String personName);
}

实现类:

public class BirthdayMessage extends SMS{
	@Override
	public void sendMessage(String personName){
		System.out.println("Happy Birthday!"+personName+"!");
	}
}
public class SpringFestivalMessage extends SMS{
	@Override
	public void sendMessage(String personName) {
		System.out.println("Happy Spring Festival!"+personName+"!");
	}
}

享元工厂:

//FlyweightFactory
public class MessageFactory {
	private List<SMS> pool = new ArrayList<SMS>();
	public MessageFactory(){
		pool.add(new SpringFestivalMessage());
		pool.add(new BirthdayMessage());
	}
	//getFlyweight
	public SMS getMessage(String key){
		if("SpringFestival".equalsIgnoreCase(key)){
			return pool.get(0);
		}else{
			return pool.get(1);
		}
	}
}

客户端调用:

public static void main(String[] args){
		MessageFactory mf = new MessageFactory();
		SMS sms = mf.getMessage("SpringFestival");
		sms.sendMessage("Tom");
		sms.sendMessage("Jerry");
		sms = mf.getMessage("Birthday");
		sms.sendMessage("Tom");
		sms.sendMessage("Jerry");
}
 

举例:棋类程序中的棋子,和输入法程序中的汉字,都可以认为使用享元模式实现。

 

分享到:
评论

相关推荐

    《设计模式:可复用面向对象软件的基础》英文版

    如适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰者模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)等。 - **行为型模式**:关注于对象间的职责分配,...

    李建忠 C#面向对象设计模式纵横谈(25):设计模式总结

    2. 结构型模式:这类模式关注如何组合和包装现有的类和对象,包括适配器(Adapter)、装饰(Decorator)、外观(Facade)、桥接(Bridge)、组合(Composite)、代理(Proxy)和享元(Flyweight)模式。C#中的委托和...

    C#设计模式.PDF

    在本章节中,作者可能会回顾面向对象编程的基本概念,如封装、继承、多态等,并为后面介绍的设计模式奠定理论基础。 ### 2. 设计模式举例 这部分内容将通过具体的例子来介绍设计模式的应用场景,帮助读者理解不同...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    从最初接触GoF的经典之作《设计模式:可复用面向对象软件的基础》,到后来的实际应用和教学过程中,作者经历了从困惑不解到豁然开朗的过程。这段旅程不仅是技术上的提升,更是思维方式的转变。 #### 1. 创建型模式 ...

    侯捷2015设计模式课件-同济

    2. 结构型模式(Structural Patterns):涉及到对象的结构,例如适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)、代理(Proxy)。 3. 行为型模式...

    C#设计模式大全

    享元模式是一个结构型设计模式,它用于减少大量相似对象的内存消耗。 - **单纯享元模式的结构**:包含享元接口、单纯享元类以及享元工厂。 - **单纯享元模式的示意性源代码**:例如,创建不同颜色的文字。 - **复合...

    设计模式精解-GoF23_种设计模式解析

    作者回顾了自己学习设计模式的心路历程,从初学时的困惑和挑战,到逐渐掌握并能够在实际项目中灵活运用这些模式,最终达到了能够向他人传授知识的境界。作者认为,学习设计模式不仅是为了掌握一项技能,更重要的是...

    11-回顾和总结(1).html

    享元模式( Flyweight ) 行为型模式包含了: 策略模式( Strategy ) 模板方法模式( Template Method ) 观察者模式( Observer ) 迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式...

    GoF 23种设计模式解析附C++实现源码(2nd Edition).pdf

    在完成所有设计模式的解析后,作者回顾了整个学习过程中的心路历程,包括初读GoF原著时的困惑、实现过程中遇到的问题以及最终领悟设计模式精髓时的喜悦。这一过程不仅仅是技术上的成长,更是一种思维方式的转变。 #...

    设计模式精解-GoF23种设计模式解析

    作者回顾了自己学习设计模式的过程,从最初的困惑和挑战到最终的领悟和应用,强调了实践的重要性。学习设计模式的过程不仅仅是理论上的理解,更是一种实践的过程,通过不断地实践才能真正掌握这些模式并将其应用于...

    追MM与23种设计模式

    享元模式是一种结构型设计模式,它用于减少创建大量相似对象所需的资源消耗。在“追MM”的过程中,享元模式可以帮助你有效地利用有限的时间和资源,通过共享某些通用的追求方式,避免重复工作。 #### 12. 代理模式...

    算法导论 DesignPatterns Gof

    - **结构型模式**:关注类或对象的组合方式,包括适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Façade)、享元(Flyweight)和代理(Proxy)。 - **行为型模式**:关注对象之间的交互以及...

    DesignPatterns:回顾在软件体系结构和设计课程中看到的设计模式

    10. 享元模式(Flyweight Pattern):通过共享技术,有效地支持大量细粒度的对象。享元模式常用于节省内存,提高性能,特别是在大量对象的场景下。 11. 原型模式(Prototype Pattern):用原型实例指定创建对象的...

    Game Programming Patterns游戏编程模式

    1. **设计模式回顾**(Design Patterns Revisited):书中的设计模式部分介绍了一些经典的设计模式,如: - **命令模式**(Command):将请求封装为一个对象,使你可以参数化不同请求,支持撤销操作,并可以将请求...

    以轻松的语言比喻了java的23种模式

    享元模式是一种结构型设计模式,它通过共享技术来有效地支持大量的细粒度对象。 **比喻理解:** 当你在聊天时,经常会遇到一些常用语句,如“你在干嘛呢?”、“早安”等。这些语句非常常见,因此你不需要每次都...

    DesignPattern.rar

    结构型模式关注如何组合类和对象以形成更大的结构,如适配器(Adapter)、桥接(Bridge)、装饰(Decorator)、外观(Facade)、代理(Proxy)、组合(Composite)和享元(Flyweight)。这些模式可以帮助我们更好地...

    designPattern

    包括适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。比如,适配器模式允许两个接口不兼容的对象...

Global site tag (gtag.js) - Google Analytics