先看维基的解释
享元模式(英语: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形,定睛一看,其实天上就一只大雁!
相关推荐
第三部分会涵盖结构型模式,如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式。这些模式主要解决类与类之间的关系,通过结构上的调整优化代码结构,提高系统的灵活性和复用性。 第四...
此外,书中还涉及到了其他设计模式,如代理模式、桥接模式、组合模式、享元模式、命令模式等。这些模式共同构成了软件设计的基石,帮助开发者遵循“开闭原则”,即对扩展开放,对修改关闭,提高代码的灵活性和可维护...
本文试图通过一个简单的字符处理的例子,运用重构的手段,一步步带你走进Flyweight模式,在这个过程中我们一同思考、探索、权衡,通过比较而得出好的实现方式,而不是给你最终的一个完美解决方案。面向对象的思想很...
综上所述,《面向模式的软件体系结构 卷4》是软件开发者、架构师和研究人员的宝贵资源,它提供了一套强大的工具和思考框架,以应对分布式计算领域的复杂性。通过学习和应用书中的模式语言,开发者可以提升其在分布式...
2. **结构型模式**:如适配器(Adapter)、装饰器(Decorator)、代理(Proxy)、桥接(Bridge)、组合(Composite)、外观(Facade)和享元(Flyweight)。这些模式处理对象的组合和关系,提供更好的结构和接口,...
- 享元模式:运用共享技术有效地支持大量细粒度的对象。 4. **行为型设计模式** - 责任链模式:避免将处理逻辑硬编码在一个对象中,将请求沿链式对象传递。 - 命令模式:将请求封装为一个对象,以便使用不同的...
享元模式是一种结构型设计模式,它通过共享尽可能多的相似对象来减少内存使用或计算开销。享元模式适用于大量细粒度对象的管理,特别是那些在程序中大量重复出现的对象。 通过上述的解释,我们可以看出C#设计模式是...
5. Flyweight模式,享元模式,运用共享技术有效地支持大量细粒度的对象。 6. Facade模式,外观模式,为子系统中的一组接口提供一个统一的接口。 7. Proxy模式,代理模式,为其他对象提供一种代理以控制对这个对象的...
2. 结构型模式:这类模式关注如何将类和对象组合成更大的结构,例如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式。这些模式帮助我们更好地管理类与类之间的关系,提高代码的可维护性...
3. **结构型模式**:如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式,这些模式关注于如何组合类和对象,以构建更复杂的软件结构。 4. **行为型模式**:包括策略模式、模板方法模式、...
包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。这些模式可以帮助我们处理类与类之间的关系,...
2. 结构型模式:适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。这些模式关注于如何组合类和对象,...
2. 结构型模式:描述如何组合类和对象以获得更大的结构,常见的有适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式和代理模式。 3. 行为型模式:涉及对象之间的职责分配,包括命令模式、解释器模式...
这些模式包括但不限于单例模式(Singleton)、工厂方法模式(Factory ...享元模式(Flyweight)、组合模式(Composite)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式...
其中包括适配器模式、桥接模式、装饰器模式、外观模式、组合模式、享元模式和代理模式。这些模式帮助我们处理不同组件之间的接口不匹配问题,增加系统的层次感,并提高代码的复用性。 行为型设计模式主要关注对象间...
结构型模式关心类和对象的组合,包括代理模式、装饰者模式、适配器模式、桥接模式、组合模式、外观模式和享元模式等。行为型模式关心类或对象怎样交互和怎样分配职责,包括模板方法模式、命令模式、责任链模式等。 ...
3. **结构型模式**:包括适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。这些模式主要处理类和对象...
2. 结构型模式:这类模式主要关注如何组合类和对象以创建更复杂的结构,包括适配器模式(Adapter)、装饰器模式(Decorator)、外观模式(Facade)、桥接模式(Bridge)、组合模式(Composite)、享元模式...
2. 结构型模式:包括适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享元模式(Flyweight)。这些模式处理对象的组合和结构...
12. 享元模式:通过共享技术有效地支持大量细粒度对象,减少内存占用。 行为型模式共有11种,其中包括: 13. 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的...