享元模式-Flyweight Pattern
我的理解:多次使用同一个对象,仅外部状态不同,在享元模式的工厂中,可以取同一个对象和不同的外部状态赋值给不同的引用。
享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。
● 抽象享元类:通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态),同时也可以通过这些方法来设置外部数据(外部状态)。
● 具体享元类:它实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了存储空间。通常我们可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。
● 非共享具体享元类:并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类;当需要一个非共享具体享元类的对象时可以直接通过实例化创建。
● 享元工厂类:享元工厂类用于创建并管理享元对象,它针对抽象享元类编程,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合(也可以是其他类型的集合),可以结合工厂模式进行设计;当用户请求一个具体享元对象时,享元工厂提供一个存储在享元池中已创建的实例或者创建一个新的实例(如果不存在的话),返回新创建的实例并将其存储在享元池中。
抽象享元类
//抽象享元类 public abstract class abstractFile { public abstract String getType(); public void save(Detail lt){ System.out.println("文件类型:"+this.getType()+"文件大小"+lt.getSize()+"文件位置"+lt.getPath()); } }
具体享元类
public class ConcreteImage extends abstractFile { @Override public String getType() { return "Image"; } }
public class ConcreteAnimation extends abstractFile { @Override public String getType() { return "Animation"; } }
public class ConcreteVideo extends abstractFile { @Override public String getType() { return "Video"; } }享元工厂
public class FileFactory { private static FileFactory factory = new FileFactory(); private static Hashtable ht; private FileFactory() { ht = new Hashtable(); abstractFile Animation,Image,Video; ht.put("A",new ConcreteAnimation()); ht.put("I",new ConcreteImage()); ht.put("V",new ConcreteVideo()); } public static FileFactory getFactory(){ return factory; } public static abstractFile getFileinFactory(String type){ return (abstractFile) ht.get(type); } }
客户端
public class Client { public static void main(String[] args) { abstractFile a1,a2,a3,a4; FileFactory.getFactory(); a1 = FileFactory.getFileinFactory("A"); a2 = FileFactory.getFileinFactory("I"); a3 = FileFactory.getFileinFactory("V"); a4 = FileFactory.getFileinFactory("A"); a1.save(new Detail("C:/Windows/System32",128)); a2.save(new Detail("C:/Windows/System64",256)); a3.save(new Detail("C:/Windows/System128",512)); a4.save(new Detail("C:/Windows/System256",1024)); System.out.println(a1 == a4); } }