最新消息

java享元模式

设计模式 金牌剑客 1309℃ 0评论

定义

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

结构

享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直观的就是内存的损耗。享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。

一个内蕴状态是存储在享元对象内部的,并且是不会随环境的改变而有所不同。因此,一个享元可以具有内蕴状态并可以共享。

一个外蕴状态是随环境的改变而改变的、不可以共享的。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态不可以影响享元对象的内蕴状态,它们是相互独立的。

类图

flyweight_simple

享元模式所涉及到的角色如下:

抽象享元(Flyweight)角色 :给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。

具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。

享元工厂(FlyweightFactory)角色 :本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。

java源代码

Flyweight.java

public interface Flyweight {
	public void operation(String state);
}

ConcreteFlyweight.java

public class ConcreteFlyweight implements Flyweight {
	private String instrinsicState;
	public ConcreteFlyweight(String instrinsicState) {
		this.instrinsicState = instrinsicState;
	}
	public void operation(String state) {
		System.out.println("instrinsicState : " + instrinsicState);
		System.out.println("state : " + state);
	}
}

FlyweightFactory.java

public class FlyweightFactory {
	private Map<String,Flyweight> flyweights;
	public FlyweightFactory(){
		this.flyweights = new HashMap<>();
	}
	public Flyweight factory(String state) {
		Flyweight flyweight = flyweights.get(state);
		if(flyweight == null){
			flyweight = new ConcreteFlyweight(state);
			flyweights.put(state, flyweight);
		}
		return flyweight;
	}
}

Client.java

public class Client {
	public static void main(String[] args) {
		FlyweightFactory factory = new FlyweightFactory();
		Flyweight aFlyweight = factory.factory("a");
		Flyweight bFlyweight = factory.factory("b");
		Flyweight cFlyweight = factory.factory("a");
		aFlyweight.operation("c");
		bFlyweight.operation("d");
		cFlyweight.operation("e");
		System.out.println(aFlyweight == cFlyweight);
	}
}

使用场景

1、当我们发现某个类型的对象有大量的实例时,我们是否可以对这些实例进行分类,经过分类后,我们发现只有很少的类别的情况下(按照内蕴状态分类,而对象之间的特性即为外蕴状态)。

2、我们发现通过使用享元模式后能够提高系统的性能和不会带来更多的复杂度时。

享元模式一般是给出本地内存资源节省的一个方案,并不适合互联网上的分布式应用的情况,不过享元模式对于排他性的要求资源的控制,是个不错的选择的。

转载请注明:QualInfo » java享元模式

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址