设计模式之享元模式

享元模式定义:使用共享对象可有效地支持大量的细颗粒的对象。

我们将对象的信息分为两个部分:内部状态与外部状态。

内部状态:对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变。

外部状态:对象得以依赖的一个标记,是随环境改变而改变的、不可以共享的状态。

优点与缺点:

享元模式大大减少应用程序创建的对象,降低程序内存的占用,增强程序的性能,但是它也提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱。

类图如下:

实现代码如下:

抽象享元角色类:

package com.designpatterns.flyweight;

/**
 * @author WSYW126
 * @version 创建时间:2016年5月7日 上午10:11:13 类说明:Alljava
 */
public abstract class FlyWeight {
	private String intrinsic;

	protected final String extrinsic;

	public FlyWeight(String extrinsic) {
		this.extrinsic = extrinsic;
	}

	public abstract void operate();

	public String getIntrinsic() {
		return intrinsic;
	}

	public void setIntrinsic(String intrinsic) {
		this.intrinsic = intrinsic;
	}

}

具体享元角色1:

package com.designpatterns.flyweight;
/**
 * @author WSYW126
 * @version 创建时间:2016年5月7日 上午10:16:39
 * 类说明:Alljava
 */
public class ConcreteFlyWeight1 extends FlyWeight {

	public ConcreteFlyWeight1(String extrinsic) {
		super(extrinsic);
	}

	@Override
	public void operate() {
		System.out.println("I am ConcreteFlyWeight1! \t\tthe intrinsic is "+super.getIntrinsic());
	}

}

具体享元角色2:

package com.designpatterns.flyweight;
/**
 * @author WSYW126
 * @version 创建时间:2016年5月7日 上午10:17:41
 * 类说明:Alljava
 */
public class ConcreteFlyWeight2 extends FlyWeight {

	public ConcreteFlyWeight2(String extrinsic) {
		super(extrinsic);
	}

	@Override
	public void operate() {
		System.out.println("I am ConcreteFlyWeight1! the intrinsic is " +super.getIntrinsic());
	}

}

享元工厂类:

package com.designpatterns.flyweight;

import java.util.HashMap;

/**
 * @author WSYW126
 * @version 创建时间:2016年5月7日 上午10:20:03 类说明:Alljava
 */
public class FlyWeightFactory {
	private static HashMap<String, FlyWeight> pool = new HashMap<String, FlyWeight>();

	public FlyWeightFactory() {
	}

	public static FlyWeight getFlyWeight(String extrinsic) {
		FlyWeight flyWeight = null;
		if (pool.containsKey(extrinsic)) {
			flyWeight = pool.get(extrinsic);
		} else {
			flyWeight = new ConcreteFlyWeight1(extrinsic);
			pool.put(extrinsic, flyWeight);
		}
		return flyWeight;
	}
}

测试类:

package com.designpatterns.flyweight;
/**
 * @author WSYW126
 * @version 创建时间:2016年5月7日 上午10:26:36
 * 类说明:Alljava
 */
public class Client {

	public static void main(String[] args) {
		FlyWeight f1 =  FlyWeightFactory.getFlyWeight("this is first!");
		FlyWeight f2 =  FlyWeightFactory.getFlyWeight("this is first!");
		FlyWeight f3 =  FlyWeightFactory.getFlyWeight("this is second!");
		System.out.println(f1==f2);
		System.out.println(f3==f2);
		f1.setIntrinsic("ConcreteFlyWeight1");
		f1.operate();

	}

}
这就是享元模式。


参考资料
设计模式之禅

备注
转载请注明出处
http://blog.csdn.net/wsyw126/article/details/51336693
                                                                                                                                                   WSYW126

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值