Java设计模式菜鸟系列(二十一)享元模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40021651

享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象。主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销。在某种程度上,你可以把单例看成是享元的一种特例。

一、uml建模:

二、代码实现

/**
 * 享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象。
 *
 * 主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销。
 */
abstract class FlyWeight {
	public abstract void method();
}

/**
 * 创建持有key的子类
 */
class SubFlyWeight extends FlyWeight {
	private String key;

	public SubFlyWeight(String key) {
		this.key = key;
	}

	@Override
	public void method() {
		System.out.println("this is the sub method,and the key is " + this.key);
	}
}

/**
 * 享元工厂:负责创建和管理享元对象
 */
class FlyweightFactory {
	private Map<String, FlyWeight> map = new HashMap<String, FlyWeight>();

	/**
	 * 获取享元对象
	 */
	public FlyWeight getFlyWeight(String key) {
		FlyWeight flyWeight = map.get(key);
		if (flyWeight == null) {
			flyWeight = new SubFlyWeight(key);
			map.put(key, flyWeight);
		}
		return flyWeight;
	}

	/**
	 * 获取享元对象数量
	 */
	public int getCount() {
		return map.size();
	}
}

/**
 * 客户端测试类
 *
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		/**
		 * 创建享元工厂
		 */
		FlyweightFactory factory = new FlyweightFactory();
		/***** 第一种情况:key相同时 ***************/
		FlyWeight flyWeightA = factory.getFlyWeight("aaa");
		FlyWeight flyWeightB = factory.getFlyWeight("aaa");
		/**
		 * 透过打印结果为true可以知道: 由于key都为"aaa",所以flyWeightA和flyWeightB指向同一块内存地址
		 */
		System.out.println(flyWeightA == flyWeightB);
		flyWeightA.method();
		flyWeightB.method();
		/**
		 * 享元对象数量:1
		 */
		System.out.println(factory.getCount());

		/***** 第二种情况:key不相同时 ***************/
		System.out.println("\n======================================");
		FlyWeight flyWeightC = factory.getFlyWeight("ccc");
		/**
		 * 打印结果为false
		 */
		System.out.println(flyWeightA == flyWeightC);
		flyWeightC.method();
		/**
		 * 享元对象数量:2
		 */
		System.out.println(factory.getCount());
	}
}

打印结果:

true

this is the sub method,and the key is aaa

this is the sub method,and the key is aaa

1

======================================

false

this is the sub method,and the key is ccc

2

三、总结

享元与单例的区别:1、与单例模式不同,享元模式是一个类可以有很多对象(共享一组对象集合),而单例是一个类仅一个对象;2、它们的目的也不一样,享元模式是为了节约内存空间,提升程序性能(避免大量的new操作),而单例模式则主要是共享单个对象的状态及特征。

时间: 2024-12-19 11:24:23

Java设计模式菜鸟系列(二十一)享元模式建模与实现的相关文章

Java设计模式菜鸟系列(十八)责任链模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每个对象持有下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求,但是发出者并不清楚最终哪个对象会处理该请求. 一.uml建模: 二.代码实现 /** * 责任链模式:有多个对象,每个对象持有下一个对象的引用,形成一条链, * * 请求在这条链上传递,直到某一对象决定处理该请求,

设计模式(十二)享元模式(Flyweight Pattern)

一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然而享元模式可以解决这个问题,下面具体看看享元模式是如何去解决这个问题的. 二.享元模式的详细介绍 在前面说了,享元模式可以解决上面的问题了,在介绍享元模式之前,让我们先要分析下如果去解决上面那个问题,上面的问题就是重复创建了同一个对象,如果让我们去解决这个问题肯定会这样想:“既然都是同一个

设计模式(十二)—— 享元模式

模式简介 运用共享技术有效地支持大量细粒度地对象. 通常情况下,面向对象技术可以增强系统地灵活性及可扩展性,在系统开发过程中,我们会不断地增加类和对象.当对象数量过多时,将会带来系统开销过高.性能下降等问题.享元模式通过共享相同或相似的对象来解决这一类问题.在介绍享元模式之前,首先要弄清楚两个概念:内部状态(Intrinsic State)和外部状态(Extrinsic State). 内部状态是存储在享元对象内部并且不会随环境改变而改变的状态,因此内部状态可以共享.例如,围棋中的棋子,它们的形

Java设计模式菜鸟系列(二)观察者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577 观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来,当一个对象改变状态时,依赖它的对象都会收到通知并自动跟新.Java已经提供了对观察者Observer模式的默认实现, Java对观察者模式的支持主要体现在Observable类和Observer接口.先看uml模型图: 一.UML模型图 二.代码实现 /** 示例:咱们去菜市场买菜 * * 小商

Java设计模式菜鸟系列(二十二)中介者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40027109 中介者模式(Mediator):主要用来降低类与类之间的耦合的,因为如果类与类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改. 一.uml建模: 二.代码实现 /** * 中介者模式(Mediator):主要用来降低类与类之间的耦合的,因为如果类与类之间有依赖关系的话, * * 不利于功能的拓展和维护,因为只要修改一个对象,其它

Java设计模式菜鸟系列(二十三)访问者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40028509 访问者模式(Visitor):把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定而算法又容易变化的系统.访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者:而它的缺点就是增加新的数据结构很困难. 一.uml建模: 二.代码实现 /** * 访问者模式(Visitor):把数据结构和作用于结构上的操作解耦合,使

Java设计模式菜鸟系列(二十)解释器模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40019829 解释器模式(Interpreter):它定义了对象与对象之间进行某种操作之后会得到什么值.一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄. 一.uml建模: 二.代码实现 /** * 解释器模式(Interpreter):它定义了对象与对象之间进行某种操作之后会得到什么值. * * 一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄. * * 示例:

Java设计模式菜鸟系列总结及博客全目录

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40031567 今天来对这23种设计模式做个总结.咱使用设计模式的目的是为了可重用代码.让代码更容易被他人理解.保证代码可靠性,当然设计模式并不是万能的,项目中的实际问题还有具体分析.咱不能为了使用设计模式而使用,而是在分析问题的过程中,想到使用某种设计模式能达到咱需要的效果,而且比不使用设计模式更有优势,那么咱该考虑使用设计模式了. 一.设计模式的一般分类 创建型(Creator)模式(

设计模式之第12章-享元模式(Java实现)

设计模式之第12章-享元模式(Java实现) “怎么回事,竟然出现了OutOfMemory的错误.鱼哥,来帮我看看啊.”“有跟踪错误原因么?是内存泄露么?”“不是内存泄露啊,具体原因不知道啊.对了,有说新对象申请不到内存空间.”“这个原因么,我曾写过一篇博文:叫OutOfMemory简单分析.不过你的明显是因为代码问题,产生对象太多,导致内存被耗尽,正好一会有堂课,讲的正好能解决你的问题.”(嘿嘿,轮到我享元模式出场了~) 享元模式之自我介绍 我,享元模式乃是池技术中的重要实现方式,具体定义如下