先看维基的解释
享元模式(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
我觉得FlyWeight的独特之处首先在于它的出发点,与其它模式不同,不是为了OCP啦,解耦啦等等,它是一个很现实的理由:节约内存。
它实现的手段也很简单,根据场景需求,将巨量对象的相对不变的特性与可变的特性抽离,称之为内蕴与外蕴,或者其它叫法,外在内在什么,反正就是这么个意思。然后看内蕴情况建立一些模板对象,把不同的外蕴传入,使之看上去有n多实例在活动,其实来来去去就这么几个"模板"对象。
当然节约内存也不是没有代价了,我认为加载外蕴所花时间倒是其次,主要一点:无法定位到具体的实例,因为其实这些都是"假象"。这个就是很大的限制了。
网上有些享元模式例子,基本上都是字符处理和图形处理,换个口味我也来练习一把
package flyWeight; public interface IFlyWeight { //外蕴传入 public void name(String name); // public void say(); }
接口,name()模拟外蕴传入
public class Person implements IFlyWeight { //模拟内蕴,相对不会变化 private final String sayProperty = "你好"; private final String category = "人类"; private String name; public String getName() { return name; } public String getSayProperty() { return sayProperty; } public String getCategory() { return category; } @Override public void say() { System.out.println(sayProperty + " 我是" + this.name + " 我是" + this.category); } @Override public void name(String name) { this.name = name; } }
一个实现类Person,享元模式中的ConcreteFlyWeight角色
public class Bird implements IFlyWeight { private final String sayProperty = "叽叽喳喳"; private final String category = "鸟类"; private String name; public String getCatagory() { return getCatagory(); } public String getName() { return name; } @Override public void say() { System.out.println(sayProperty + " 我叫" + this.name + " 我是" + this.category); } @Override public void name(String name) { this.name = name; } }
另一个实现类
public class Family implements IFlyWeight { private HashMap<String,IFlyWeight> map = new HashMap<String,IFlyWeight>(); public void add(String name,IFlyWeight flyWeight){ map.put(name, flyWeight); } @Override public void name(String name) { } @Override public void say() { Iterator<Entry<String, IFlyWeight>> it = map.entrySet().iterator(); while(it.hasNext()){ Map.Entry<String, IFlyWeight> entry = it.next(); String name = entry.getKey(); IFlyWeight flyWeight = entry.getValue(); flyWeight.name(name); flyWeight.say(); } } }
这个实现类有点不一样,用到Composite模式,持有一个享元的聚合。
import java.util.HashMap; public class FlyWeightFactory { private HashMap<String,IFlyWeight> hp = new HashMap<String, IFlyWeight>(); IFlyWeight flyWeight; public IFlyWeight getLife(String category) { flyWeight = (IFlyWeight) hp.get(category); if (flyWeight == null) { if (category.equals("人类")) { flyWeight = new Person(); hp.put(category, flyWeight); } else if (category.equals("鸟类")) { flyWeight = new Bird(); hp.put(category, flyWeight); } } return flyWeight; } }
享元工厂FlyWeightFactory,管理并提供享元实例,就是那些"模板"实例
public class Client { private static FlyWeightFactory factory = new FlyWeightFactory(); private static IFlyWeight flyWeight; public static void main(String[] args) { //人 for(int i=0;i<=2;i++){ flyWeight = factory.getLife("人类"); flyWeight.name(String.valueOf(i)); flyWeight.say(); } System.out.println(""); //鸟 for(int i=0;i<=2;i++){ flyWeight = factory.getLife("鸟类"); flyWeight.name(String.valueOf(i)); flyWeight.say(); } System.out.println(""); //家 Family family = new Family(); family.add("女主人",factory.getLife("人类")); family.add("男主人",factory.getLife("人类")); family.add("爱家的鸟",factory.getLife("鸟类")); family.say(); } }
写个客户端测试一下
这里是输出结果:
你好 我是0 我是人类 你好 我是1 我是人类 你好 我是2 我是人类 叽叽喳喳 我叫0 我是鸟类 叽叽喳喳 我叫1 我是鸟类 叽叽喳喳 我叫2 我是鸟类 叽叽喳喳 我叫爱家的鸟 我是鸟类 你好 我是女主人 我是人类 你好 我是男主人 我是人类
来来回回就2个实例在演戏,看上去却貌似很多,是不是觉得有点无聊呵呵
结束语:一群大雁在天上飞,一会排成S形,一会排成B形,定睛一看,其实天上就一只大雁!
相关推荐
享元模式的分析以及实际应用 1.前言 4 1.1 课题的研究背景 4 1.2 课题主要研究目标 4 2.相关技术简介 4 2.1Java简介 4 3. 享元模式介绍 5 3.1举例分析 5 3.2基本介绍 5 3.3享元模式的具体角色 5 4. 享元模式之借书...
设计模式的享元模式的例子,希望对大家有用~~~~~~~~
设计模式之享元模式 设计模式之享元模式 设计模式之享元模式
用享元模式分析并实现一个具体案例。在一家咖啡店中客户每买一杯咖啡,咖啡制做系统就相应地创建该杯咖啡的配料表,并将其发送给店内的咖啡制做机,咖啡制做机接收到系统发送的配料表后便开始制造客户所买的咖啡。...
在享元模式中可以共享的相同内容称为内部状态(Intrinsic State),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同...
设计模式之享元模式的两种实现方式——单纯享元模式和复合享元模式,已经各种的UML类设计图
享元模式的示例代码和文档,学习享元模式的参考资料。
设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx
享元模式Demo
享元模式最适合于解决因创建大量类似对象而累及性能的问题,本文将来总结JavaScript设计模式编程中的享元模式使用,包括在DOM操作时的利用示例:
设计模式中的享原模式技术入门,可用于各种说明场合,一看就会哦
Android享元模式Demo,同步文章地址:http://blog.csdn.net/qq_28690547/article/details/51144424
享元模式运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。
设计模式-享元模式(讲解及其实现代码)
java设计模式【之】享元模式【源码】【场景:多缓存可选模式】 /** * 享元模式(预加载单例) * “元” 理解为 “同一地址对象” * 运用共享技术,减少对象的创建,降低对象的数量,降低内存消耗,提高性能 * ...
设计模式(C#)之享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度的对象。
C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)
享元模式 java 设计模式 享元模式 java 设计模式
主要是设计模式老师布置的作业,内含精美文档,希望一起学习