`

亨元模式

阅读更多
flyweight模式的出现是因为面向对象开发有时在设计和性能方面存在相悖的情况,当内存因为对象过多而产生泄露导致宕机,而这又是由于业务本身需求的时候,我们就不得不采用以时间换空间的策略了.
这里便引入了亨元模式.
我理解的亨元模式是抽取对象中共有的属性作为元,产生对象并放在池中(显然此时创建的对象要少的多),然后在用到的时候直接从池中取得.
但这样做很显然会涉及到同步的问题,此时有N个用户需要该对象,但此时又加了锁,那只能进入等待队列中.该怎么样解决,因为我实际并没有在专案中用到过该模式,所以也不甚明白,总之感觉就算效率低下也总比宕机要好的多.
亦有有经验人在解决同步时称:在使用享元模式时,对象池中的享元对象尽量的多,多到足够满足业务为止。
此为经验之谈,以后遇到应该注意.
代码是取自别人:
package pattern.flyweight;

public class SignInfo {
	// 报名人员的ID
	private String id;
	// 考试地点
	private String location;
	// 考试科目
	private String subject;
	// 邮寄地址
	private String postAddress;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public String getPostAddress() {
		return postAddress;
	}

	public void setPostAddress(String postAddress) {
		this.postAddress = postAddress;
	}
}

package pattern.flyweight;

import java.util.HashMap;

public class SignInfoFactory {
	// 报名信息的对象工厂
	private static HashMap<ExtrinsicState, SignInfo> pool = new HashMap<ExtrinsicState, SignInfo>();

	// 报名信息的对象工厂
	
	public static SignInfo getSignInfo() {
		return new SignInfo();
	}

	// 从池中获得对象
	public static SignInfo getSignInfo(ExtrinsicState key) {
		// 设置返回对象
		SignInfo result = null;
		// 池中没有该对象,则建立,并放入池中
		if (!pool.containsKey(key)) {
			System.out.println(key + "----建立对象,并放置到池中");
			result = new SignInfo();
			pool.put(key, result);
		} else {
			result = pool.get(key);
			System.out.println(key + "---直接从直池中取得");
		}
		return result;
	}
}

package pattern.flyweight;

public class ExtrinsicState {
	// 考试科目
	private String subject;
	// 考试地点
	private String location;

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof ExtrinsicState) {
			ExtrinsicState state = (ExtrinsicState) obj;
			return state.getLocation().equals(location)
					&& state.getSubject().equals(subject);
		}
		return false;
	}

	@Override
	public int hashCode() {
		return subject.hashCode() + location.hashCode();
	}
}

package pattern.flyweight;

public class Client {
	public static void main(String[] args) {
		ExtrinsicState state1 = new ExtrinsicState();
		state1.setSubject("科目1");
		state1.setLocation("上海");
		SignInfoFactory.getSignInfo(state1);
		ExtrinsicState state2 = new ExtrinsicState();
		state2.setSubject("科目1");
		state2.setLocation("上海");
		// 初始化对象池
		SignInfoFactory.getSignInfo(state1);
		// 计算执行10万次需要的时间
		long currentTime = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			SignInfoFactory.getSignInfo(state2);
		}
		long tailTime = System.currentTimeMillis();
		System.out.println("执行时间:" + (tailTime - currentTime) + " ms");
	}
}


需要注意的是外蕴一般要用java的基本类型如int,String等,像以上用自己定义的object来做外酝的话,效率相较低下.
分享到:
评论

相关推荐

    c#代码介绍23种设计模式-12亨元模式(附代码)

    这样可能会出现内存使用越来越多的情况,这样的问题是非常严重,然而享元模式可以解决这个问题 1. 享元模式的实现精髓: “既然都是同一个对象,能不能只创建一个对象,然后下次需要创建这个对象的时候,让它直接用...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN 2、代理模式PROXY PATTERN 3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT ...23、亨元模式 24、备忘录模式

    您的设计模式

    亨元模式使用共享对象可有效地支持大量的细粒度的对象。 24. 备忘录模式(Memento Pattern) 备忘录模式在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到...

    Java设计模式经典搞笑珍藏版

    亨元模式运用共享技术有效地支持大量细粒度的对象。 #### 二十五、备忘录模式(Memento Pattern) 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该...

    24种设计模式介绍与6大设计原则

    16. 亨元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。 17. 享元模式(享元模式在文档中出现了两次,这里默认为漏识别,实际上享元模式是设计模式中的一种)。 18. 备忘录模式(Memento ...

    java24种设计模式.pdf

    - 亨元模式(FlyweightPattern):运用共享技术有效地支持大量细粒度的对象。 - 备忘录模式(MementoPattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将...

    23中设计模式

    23. 亨元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。 24. 备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将...

    Java23种设计模式讲解

    23. 亨元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。 除了上述23种设计模式外,书中还讲解了六大设计原则,它们是面向对象设计的基本原则,可用来提高代码的可复用性、灵活性和可维护性...

    开发设计模式

    23. 亨元模式【FlyweightPattern】:运用共享技术有效地支持大量细粒度的对象。 24. 备忘录模式【MementoPattern】:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该...

    设计模式王维雄实用教案.pptx

    6. 亨元模式:通过共享技术,有效地支持大量细粒度对象。 7. 代理模式:为其他对象提供一个代理以控制对该对象的访问。 行为型模式涉及对象之间的交互和职责分配,例如: 1. 命令模式:将请求封装为一个对象,以便...

Global site tag (gtag.js) - Google Analytics