Flyweight Pattern
享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。
享元模式以共享的方式高效地支持大量细粒度对象的重用,享元对象能做到共享的关键是区分了内部状态(Intrinsic State)和外部状态(Extrinsic State)。
正因为区分了内部状态和外部状态,我们可以将具有相同内部状态的对象存储在享元池中,享元池中的对象是可以实现共享的,需要的时候就将对象从享元池中取出,实现对象的复用。**通过向取出的对象注入不同的外部状态,**可以得到一系列相似的对象,而这些对象在内存中实际上只存储一份。
享元模式结构图:
带有外部状态的享元模式:
将外部状态封装后动态的插入共享数据中,以实现外部状态和内部状态的分离。
享元模式难在对于不变的内部状态的分离,想清楚了这一点直接插入外部状态就能很方便的使用享元模式进行设计。
一个多功能文档编辑器,在文本文档中可以插入图片、动画、视频等多媒体资料,为了节约系统资源,相同的图片、动画和视频在同一个文档中只需保存一份,但是可以多次重复出现,而且它们每次出现时位置和大小均可不同。
//抽象享元类
public abstract class Media {//共有属性,每个媒体的资料的唯一IDprotected String name;public Media(String name) {this.name = name;}//插入外部状态public abstract void show(Coordinates coordinates);
}//具体享元类
public class MediaImage extends Media {public MediaImage(String name) {super(name);}@Override public void show(Coordinates coordinates) {System.out.println(name + "Image show " + String());}
}//具体享元类
public class MediaVideo extends Media {public MediaVideo(String name) {super(name);}@Override public void show(Coordinates coordinates) {System.out.println(name + "Video show " + String());}
}//享元工厂类,使用单例实现。
public enum MediaFactory {INSTANCE;private HashMap<MediaType, HashMap<String, Media>> hashMap;MediaFactory() {hashMap = new HashMap<>();}public Media getMedia(MediaType mediaType, String name) {HashMap<String, Media> stringMediaHashMap = (mediaType);if (stringMediaHashMap == null) {//创建一层放入stringMediaHashMap = new HashMap<>();hashMap.put(mediaType, stringMediaHashMap);}Media media = (name);if (media == null) {switch (mediaType) {case Image:media = new MediaImage(name);break;case Video:media = new MediaVideo(name);break;case Animation:media = new MediaAnimation(name);break;}stringMediaHashMap.put(name, media);}return media;}
}//媒体类型
public enum MediaType {Image,Video;
}//测试类
public class ZZMainClass {public static void main(String[] args) {Media one = Media(MediaType.Video, "One");Media one1 = Media(MediaType.Video, "One");System.out.println(one == one1);Media imageOne = Media(MediaType.Image, "one");Media imageTwo = Media(MediaType.Image, "two");System.out.println(imageOne == imageTwo);one.show(new Coordinates(1, 1, 100, 100));imageOne.show(new Coordinates(2, 2, 200, 300));imageTwo.show(new Coordinates(3, 3, 3, 3));}
}
打印结果:
true
OneAnimation show {x=1, y=1, width=100, height=100}
OneAnimation show {x=2, y=2, width=100, height=100}
false
oneImage show {x=2, y=2, width=200, height=300}
twoImage show {x=3, y=3, width=3, height=3}
本文发布于:2024-01-29 02:36:39,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170646700412090.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |