`
Flyingh
  • 浏览: 18297 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Flyweight

 
阅读更多

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

1).FlyweightDemo.java

 

package com.flyingh.demo;

public class FlyweightDemo {
	public static void main(String[] args) {
		String str1 = "abc";
		String str2 = "a" + "bc";
		String str3 = "abc";
		String str4 = str3 + "";
		final String str5 = "ab";
		System.out.println(str1 == str2);
		System.out.println(str2 == str3);
		System.out.println(str3 == str4);
		str4 = str5 + "c";
		System.out.println(str3 == str4);
		System.out.println("*********");
		Integer i1 = 3;
		Integer i2 = 3;
		Integer i3 = 1 + 2;
		System.out.println(i1 == i2);
		System.out.println(i2 == i3);
		System.out.println("*********");
		Long l1 = 127l;
		Long l2 = 127l;
		System.out.println(l1 == l2);
	}
}

 程序运行结果如下:

 

true
true
false
true
*********
true
true
*********
true

 2).假设有许许多多的Athlete进行比赛,他们按Key(包含age,sex,weight)分组进行比赛,即使分组后每组也有许许多多的Athlete:

Key.java

package com.flyingh.vo;

public class Key {
	private int age;
	private Sex sex;
	private float weight;

	public Key(int age, Sex sex, float weight) {
		super();
		this.age = age;
		this.sex = sex;
		this.weight = weight;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Sex getSex() {
		return sex;
	}

	public void setSex(Sex sex) {
		this.sex = sex;
	}

	public float getWeight() {
		return weight;
	}

	public void setWeight(float weight) {
		this.weight = weight;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((sex == null) ? 0 : sex.hashCode());
		result = prime * result + Float.floatToIntBits(weight);
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Key other = (Key) obj;
		if (age != other.age)
			return false;
		if (sex != other.sex)
			return false;
		if (Float.floatToIntBits(weight) != Float.floatToIntBits(other.weight))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "[age=" + age + ", sex=" + sex + ", weight=" + weight + "]";
	}
	
}
Athlete.java
package com.flyingh.vo;

public class Athlete {
	private Key key;

	public Athlete(Key key) {
		super();
		this.key = key;
	}

	public Key getKey() {
		return key;
	}

	public void setKey(Key key) {
		this.key = key;
	}

	public void setName(String name) {
		System.out.println("名字为:" + name);
	}

}
 Sex.java
package com.flyingh.vo;

public enum Sex {
	man, woman;
}
 AthleteFactory.java
package com.flyingh.pool;

import java.util.HashMap;
import java.util.Map;

import com.flyingh.vo.Key;
import com.flyingh.vo.Athlete;

public class AthleteFactory {
	private static Map<Key, Athlete> map = new HashMap<Key, Athlete>();

	public static Athlete getAthlete(Key key) {
		if (map.containsKey(key)) {
			System.out.println(key + "已经存在!");
			return map.get(key);
		} else {
			System.out.println(key + "不存在,创建后放入Pool!");
			Athlete person = new Athlete(key);
			map.put(key, person);
			return person;
		}
	}
}
 Client.java
package com.flyingh.client;

import com.flyingh.pool.AthleteFactory;
import com.flyingh.vo.Key;
import com.flyingh.vo.Athlete;
import com.flyingh.vo.Sex;

public class Client {
	public static void main(String[] args) {
		Key key1 = new Key(18, Sex.man, 60);
		Key key2 = new Key(20, Sex.woman, 55);
		Athlete zhangsan = AthleteFactory.getAthlete(key1);
		zhangsan.setName("张三");
		Athlete lisi = AthleteFactory.getAthlete(key1);
		lisi.setName("李四");
		Athlete wangwu = AthleteFactory.getAthlete(key2);
		wangwu.setName("王五");
		Athlete zhaoliu = AthleteFactory.getAthlete(new Key(18, Sex.man, 60));
		zhaoliu.setName("赵六");
	}
}
 程序运行结果如下:
[age=18, sex=man, weight=60.0]不存在,创建后放入Pool!
名字为:张三
[age=18, sex=man, weight=60.0]已经存在!
名字为:李四
[age=20, sex=woman, weight=55.0]不存在,创建后放入Pool!
名字为:王五
[age=18, sex=man, weight=60.0]已经存在!
名字为:赵六
 
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    C#设计模式之Flyweight

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

    设计模式之轻量级Flyweight

    本文将深入探讨“轻量级”设计模式之一——Flyweight(享元)模式,它是如何在减少内存消耗的同时提高系统性能的。 Flyweight模式的核心思想是共享对象,通过复用大量相似对象来减少内存占用。这种模式通常在处理...

    C++ Flyweight模式

    **C++ Flyweight模式** Flyweight模式是一种设计模式,属于结构型模式的一种,它主要解决的是在大量对象创建时可能导致的内存消耗问题。在计算机科学中,尤其是编程领域,内存管理是一个关键的话题,Flyweight模式...

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

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

    Flyweight.rar

    飞重量(Flyweight)设计模式是一种结构型设计模式,它旨在减少对象的创建,从而节约内存,提高系统性能。在面向对象编程中,当大量相似对象的创建导致资源消耗过大时,飞重量模式就能派上用场。这个模式通过共享...

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

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

    软件模式之Flyweight模式.docx

    《软件模式之Flyweight模式》 Flyweight模式是一种设计模式,其主要目的是通过共享技术来减少内存中对象的数量,从而优化内存使用效率。在对象数量庞大且大部分状态可以外部化的情况下,Flyweight模式尤其适用。它...

    java设计模式之Flyweight文.pdf

    Java设计模式中的Flyweight模式是一种结构型设计模式,其主要目标是减少对象的创建,通过共享相似对象来降低内存使用和提高性能。在面向对象编程中,如果对象数量过多,可能会导致内存消耗过大,尤其是在处理大量...

    java设计模式之Flyweight[归纳].pdf

    Java设计模式中的Flyweight模式是一种结构型模式,其主要目的是减少对象的数量,通过共享大量具有相似属性的对象来节省内存和提高性能。Flyweight模式的核心思想是区分对象的内部状态(intrinsic state)和外部状态...

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

    2. **享元工厂(Flyweight Factory)**:负责创建和管理享元对象,确保享元对象的正确共享,并提供一个接口供客户端获取享元对象。享元工厂还需要处理外部状态,可能需要通过组合或聚合外部状态来构造完整的对象。 3...

    10-Flyweight.rar

    2. **Concrete Flyweight(具体享元)类**:实现了Flyweight接口,提供了具体的业务实现。每个具体享元实例都是可共享的,它们共同维护内部状态。 3. **Flyweight Factory(享元工厂)**:负责创建和管理享元对象,...

    享元模式flyweight

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

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

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

    C++设计模式代码资源13_Flyweight.zip

    本资源"Flyweight"是关于C++中的享元设计模式的实现。享元模式是一种结构型设计模式,主要目标是通过共享大量相似对象来减少内存消耗,提高系统性能。 享元模式的核心思想是区分对象内部状态(intrinsic state)和...

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

    var flyweight = _factory.GetFlyweight(state); flyweight.Operation(state); } } } ``` 通过上述步骤,享元模式有效地减少了对象的数量,提高了系统性能。然而,它也有其局限性,例如,如果外部状态过多,...

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

    享元模式(Flyweight Pattern)是设计模式中的一种优化模式,主要用于减少创建大量相似对象所需的内存消耗。在C++程序设计中,当系统中存在大量的相同或相似的对象时,使用享元模式可以有效地降低内存占用,提高系统...

    设计模式学习笔记--Flyweight享元模式.docx

    享元模式的核心是Flyweight类,它是需要被共享的对象,通常包含两个部分:内在状态(Intrinsic State)和外在状态(Extrinsic State)。内在状态是指对象内部不变的部分,可以在多个对象之间共享;外在状态是随环境...

    FlyWeight享元

    1. **享元对象(Flyweight)**:它是可共享的对象,通常具有部分状态,这部分状态是可以共享的,不会随环境改变而改变。 2. **内部状态(Intrinsic State)**:这部分状态是享元对象内部维护的状态,可以共享,不会...

    软件模式之Flyweight模式.doc

    软件模式之Flyweight模式.doc

Global site tag (gtag.js) - Google Analytics