`
samsongbest
  • 浏览: 171521 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

09 结构模式 - 享元(Flyweight)模式

 
阅读更多

1.含义

享元模式以共享的方式高效地支持大量的细粒度对象。

 

2.类图

单纯享元


复合享元


 

3.代码

单纯享元

/*
 * 抽象享元角色
 */
abstract public class Flyweight {
	abstract public void operation(String state);
}


/*
 * 具体享元角色
 */
public class ConcreteFlyweight extends Flyweight {
	private Character intrinsicState = null;

	public ConcreteFlyweight(Character state) {
		this.intrinsicState = state;
	}

	public void operation(String state) {
		System.out.println("\nIntrinsic State =" + intrinsicState
				+ ",Extrinsic State = " + state);
	}
}


/*
 * 享元工厂角色
 */
public class FlyweightFactory {
	private HashMap files = new HashMap();
	private Flyweight lnkFlyweight;

	public FlyweightFactory() {
	}

	public Flyweight factory(Character state) {
		if (files.containsKey(state)) {
			return (Flyweight) files.get(state);
		} else {
			Flyweight fly = new ConcreteFlyweight(state);
			files.put(state, fly);
			return fly;
		}
	}

	public void checkFlyweight() {
		Flyweight fly;
		int i = 0;
		System.out.println("\n======checkFlyweight()======");
		for (Iterator it = files.entrySet().iterator(); it.hasNext();) {
			Map.Entry e = (Map.Entry) it.next();
			System.out.println("Item " + (++i) + ":" + e.getKey());
		}
		System.out.println("======checkFlyweight()======");
	}
}


/*
 * 测试类
 */
public class Test {

	public static void main(String[] args) {
		FlyweightFactory f = new FlyweightFactory();
		Flyweight fly = f.factory(new Character('a'));
		fly.operation("First Call");
		fly = f.factory(new Character('b'));
		fly.operation("Second Call");
		fly = f.factory(new Character('a'));
		fly.operation("Third Call");
		f.checkFlyweight();
	}
}
 

复合享元

/*
 * 抽象享元角色
 */
abstract public class Flyweight {
	abstract public void operation(String state);
}


/*
 * 具体享元角色
 */
public class ConcreteFlyweight extends Flyweight {
	private Character intrinsicState = null;

	public ConcreteFlyweight(Character state) {
		this.intrinsicState = state;
	}

	public void operation(String state) {
		System.out.println("\nIntrinsic State =" + intrinsicState
				+ ",Extrinsic State = " + state);
	}
}


/*
 * 具体复合享元角色
 */
public class ConcreteCompositeFlyweight extends Flyweight {
	private HashMap files = new HashMap(10);
	private Flyweight flyweight;

	public ConcreteCompositeFlyweight() {
	}

	public void add(Character key, Flyweight fly) {
		files.put(key, fly);
	}

	public void operation(String extrinsicState) {
		Flyweight fly = null;
		for (Iterator it = files.entrySet().iterator(); it.hasNext();) {
			Map.Entry e = (Map.Entry) it.next();
			fly = (Flyweight) e.getValue();
			fly.operation(extrinsicState);
		}
	}
}


/*
 * 享元工厂角色
 */
public class FlyweightFactory {
	private HashMap files = new HashMap();
	private Flyweight lnkFlyweight;

	public FlyweightFactory() {
	}

	/**
	 * 复合享元工厂方法,所需状态以参量形式传入
	 * @param compositeState
	 * @return
	 */
	public Flyweight factory(String compositeState) {
		ConcreteCompositeFlyweight ccfw = new ConcreteCompositeFlyweight();
		int len = compositeState.length();
		Character state = null;
		for (int i = 0; i < len; i++) {
			state = new Character(compositeState.charAt(i));
			System.out.println("factory(" + state + ")");
			ccfw.add(state, this.factory(state));
		}
		return ccfw;
	}

	/**
	 * 单纯享元工厂方法,所需状态以参量形式传入
	 * 
	 * @param state
	 * @return
	 */
	public Flyweight factory(Character state) {
		if (files.containsKey(state)) {
			return (Flyweight) files.get(state);
		} else {
			Flyweight fly = new ConcreteFlyweight(state);
			files.put(state, fly);
			return fly;
		}
	}

	public void checkFlyweight() {
		Flyweight fly;
		int i = 0;
		System.out.println("\n======checkFlyweight()======");
		for (Iterator it = files.entrySet().iterator(); it.hasNext();) {
			Map.Entry e = (Map.Entry) it.next();
			System.out.println("Item " + (++i) + ":" + e.getKey());
		}
		System.out.println("======checkFlyweight()======");
	}
}


/*
 * 测试类
 */
public class Test {

	public static void main(String[] args) {
		FlyweightFactory f = new FlyweightFactory();
		Flyweight fly = f.factory("aba");
		fly.operation("Composite Call");
	}
}
 

z

  • 大小: 90.4 KB
  • 大小: 61.3 KB
分享到:
评论

相关推荐

    c++设计模式-结构型模式-享元模式

    c++设计模式-结构型模式-享元模式;qt工程;c++简单源码; 享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类...

    6.设计模式-享元模式1

    设计模式-享元模式 设计模式是软件设计中的一种解决方案,旨在提高代码的可维护性、灵活性和可重用性。享元模式(Flyweight Pattern)是结构型模式的一种,主要用于减少大量相似对象的内存占用,提高系统的性能和...

    c++-设计模式之享元模式(Flyweight)

    享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建大量小对象所带来的内存开销。通过共享对象,享元模式能够有效地支持大量细粒度的对象,减少内存使用并提高性能。它常用于需要大量重复对象的场景...

    java基础设计模式模式 - 享元模式.7z

    享元模式是一种优化资源使用的软件设计模式,尤其适用于对象创建成本较高或系统内存有限的场景。在Java编程中,享元模式通过共享已有对象来减少内存中的对象数量,从而提高性能。这种模式的核心是实现细粒度对象的...

    享元模式flyweight

    享元模式(Flyweight Pattern)是一种结构型设计模式,它能有效地减少系统中对象的数量,从而降低内存消耗,提高性能。这种模式通过共享大量相似对象的内部状态来达到这一目标,而只保留对象的外部状态在外部管理。...

    学习php设计模式 php实现享元模式(flyweight)

    享元模式(Flyweight Pattern)是软件设计中的一种结构型设计模式,它通过共享技术来支持大量细粒度的对象,以此来降低内存中对象的数量。在PHP中实现享元模式,可以帮助我们优化程序性能,特别是在对象数目过多时,...

    设计模式(C#)之享元模式(Flyweight Pattern)

    享元模式是设计模式中的一种结构型模式,它主要通过共享已有对象来减少内存中对象的数量,从而提高系统性能。在C#编程中,享元模式尤其适用于那些创建大量相似对象且内存消耗较大的场景。本篇文章将深入探讨享元模式...

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)

    享元模式是面向对象设计中的一种结构型模式,它的主要目的是通过共享大量相似对象来减少内存的使用,提高系统的性能。在C#编程语言中,我们可以利用享元模式来优化那些具有大量实例但大部分状态可以共享的对象。在这...

    设计模式的享元模式的例子

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是通过共享大量细粒度对象来减少内存的使用,提高系统性能。在许多场景下,尤其是处理大量相似对象时,享元模式能显著减少内存开销。这个压缩包文件...

    设计模式专题之(十二)享元模式---设计模式享元模式示例代码(python--c++)

    享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到提高系统性能的目的。在大型软件系统中,特别是在处理大量相似对象时,享元模式能够有效地减少内存开销,提高系统运行效率。在这...

    结构型模式之共享元模式(Flyweight)

    6共享元模式(Flyweight) 用意:以共享的方式高效地支持大量的细粒度对象

    设计模式之享元模式

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在大量对象创建时。享元模式通过共享已有对象来减少内存中对象的数量,从而达到降低内存消耗的效果。这种模式适用于那些轻量级对象,...

    C++设计模式课件13_Flyweight_享元模式.pdf

    #### 二、享元模式的基本结构 享元模式的核心在于通过共享技术来有效地支持大量细粒度的对象。它通常包含以下几个组成部分: 1. **抽象享元角色(Flyweight)**:定义一个接口,用于具体享元类继承或实现。它负责...

    C++设计模式之享元模式(Flyweight)

    C++设计模式之享元模式(Flyweight)是一种结构型设计模式,主要用于解决大量相似对象的创建和操作所带来的内存负载问题。该模式的主要设计目标是通过共享对象来减少内存负载,提高系统的性能。 享元模式顾名思义...

    C#设计模式之Flyweight

    "Flyweight"(享元)设计模式是一种结构型模式,其核心目的是为了有效地支持大量细粒度对象的创建和使用,通过共享已经存在的对象来减少内存消耗,提高系统性能。在C#中,Flyweight模式尤其适用于那些内部状态可共享...

    设计模式----命令模式

    享元模式通常与Flyweight接口、Concrete Flyweight(具体享元)、Flyweight Factory(享元工厂)三个角色一起工作,工厂负责创建和管理享元对象,确保享元对象的复用,避免因创建过多的实例导致内存开销过大。...

    C#面向对象设计模式纵横谈\12 结构型模式Flyweight享元模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第12节:结构型模式Flyweight享元模式

    Java设计模式之享元模式

    享元模式是软件设计模式中的一种结构型模式,它的核心思想是通过共享已经存在的对象来减少内存中的对象数量,从而提高系统性能。在Java中,享元模式常用于处理大量相似对象的场景,例如在图形界面中绘制大量相似的...

Global site tag (gtag.js) - Google Analytics