享元模式
在编程世界中,当系统需要大量的小粒度对象时,使用共享的技术可以很好地控制资源的占用。
GOF对享元模式的定义是:“运用共享技术有效地支持大量细粒度的对象”。
内部状态就是指享元对象内部的不会随环境而改变的可以共享的部分,如连连看游戏中的某张图片。反之,随着环境的改变而做出改变的,无法共享的状态就是外部状态,比如连连看游戏中每个图片的坐标。
以下为按照享元模式来修改的连连看游戏的设计及代码。
public abstract class ImageNode{ public abstract void Show(); }public class CImageNode extends ImageNode{ private String imageType; public CImageNode(String imageType) { this.ImageType = imageType; } @Override public void Show() { System.out.println("图片是:"+imageType); } }public class ImageNodeFactory{ private Hashtable<String,CImageNode> imageNodes = new Hashtable<String,CImageNode>(); public ImageNodeFactory() { imageNodes.put("狮子",new CImageNode("狮子")); imageNodes.put("老虎",new CImageNode("老虎")); imageNodes.put("大象",new CImageNode("大象")); imageNodes.put("长颈鹿",new CImageNode("长颈鹿")); } public ImageNode GetImage(String imageType) { return imageNodes.get(imageType); } }public static void main(String[] args){ ImageNodeFactory imageNodeFactory = new ImageNodeFactory(); HashTable<Integer,ImageNode> imageList = new HashTable<Integer,ImageNode>(); int randomNumber = 0; for(int i = 0;i<10;i++) { randomNumber = (int)(Math.random()*10); switch(randomNumber/2) { case 0:imageList.put(i,imageNodeFactory.GetImage("狮子"));break; case 1:imageList.put(i,imageNodeFactory.GetImage("老虎"));break; case 2:imageList.put(i,imageNodeFactory.GetImage("大象"));break; case 3:imageList.put(i,imageNodeFactory.GetImage("长颈鹿"));break; default: imageList.put(i,imageNodeFactory.GetImage("狮子"));break; } } System.out.println("ready!"); for(int i = 0;i<10;i++) { System.out.print(i+"号坐标的"); (imageList.get(i)).Show(); } int a=0,b=0; while(a==b) { a=(int)(Math.random()*10); b=(int)(Math.random()*10); } if(imageList.get(A)==imageList.get(B)) { System.out.println("可消除!"); } else { System.out.println("不可消除!"); } }
享元对象的最大特点就是不可被改变。
作者:球球球球笨
链接:https://www.jianshu.com/p/c9223e04cb9d