JAVA设计模式之享元模式
2017-04-26 15:06
387 查看
简介
它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都共享一个对象,那么就大大节约了资源。
在JAVA语言中,String类型就是使用了享元模式。String对象是final类型,对象一旦创建就不可改变。在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝。String a=”abc”,其中”abc”就是一个字符串常量。
代码实现
先定义一个抽象的Flyweight类:public abstract class Flyweight{ public abstract void operation(); }
实现一个具体类:
public class ConcreteFlyweight extends Flyweight{ private String string; public ConcreteFlyweight(String str){ string = str; } public void operation() { System.out.println("Concrete---Flyweight : " + string); } }
实现一个工厂方法类:
import java.util.Hashtable; public class FlyweightFactory{ private Hashtable flyweights = new Hashtable();//-------------------1 public FlyweightFactory(){} public Flyweight getFlyWeight(Object obj){ Flyweight flyweight = (Flyweight) flyweights.get(obj);//----------------2 if(flyweight == null){//-----------------------3 //产生新的ConcreteFlyweight flyweight = new ConcreteFlyweight((String)obj); flyweights.put(obj, flyweight);//--------------------5 } return flyweight;//-------------------------------------------6 } public int getFlyweightSize(){ return flyweights.size(); } }
这个工厂方法类非常关键,这里详细解释一下:
在1处定义了一个Hashtable用来存储各个对象;在2处选出要实例化的对象,在6处将该对象返回,如果在Hashtable中没有要选择的对象,此时变量flyweight为null,产生一个新的flyweight存储在Hashtable中,并将该对象返回。
最后看看Flyweight的调用:
import java.util.Hashtable; public class FlyweightPattern{ FlyweightFactory factory = new FlyweightFactory(); Flyweight fly1; Flyweight fly2; Flyweight fly3; Flyweight fly4; Flyweight fly5; Flyweight fly6; /** *//** Creates a new instance of FlyweightPattern */ public FlyweightPattern(){ fly1 = factory.getFlyWeight("Google"); fly2 = factory.getFlyWeight("Qutr"); fly3 = factory.getFlyWeight("Google"); fly4 = factory.getFlyWeight("Google"); fly5 = factory.getFlyWeight("Google"); fly6 = factory.getFlyWeight("Google"); } public void showFlyweight(){ fly1.operation(); fly2.operation(); fly3.operation(); fly4.operation(); fly5.operation(); fly6.operation(); int objSize = factory.getFlyweightSize(); System.out.println("objSize = " + objSize); } public static void main(String[] args){ System.out.println("The FlyWeight Pattern!"); FlyweightPattern fp = new FlyweightPattern(); fp.showFlyweight(); } }
下面是运行结果:
Concrete---Flyweight : Google Concrete---Flyweight : Qutr Concrete---Flyweight : Google Concrete---Flyweight : Google Concrete---Flyweight : Google Concrete---Flyweight : Google objSize = 2
我们定义了6个对象,其中有5个是相同的,按照Flyweight模式的定义“Google”应该共享一个对象,在实际的对象数中我们可以看出实际的对象却是只有2个。
相关文章推荐
- java设计模式之享元模式Flyweight
- 设计模式--结构模式--享元模式--Java
- JAVA系列-设计模式-享元模式
- JAVA设计模式(08):结构型-享元模式(Flyweight)
- 黑马程序员_ java高新之自动装箱与拆箱(引入设计模式:享元模式)
- JAVA设计模式之享元模式
- java设计模式———享元模式
- java设计模式12——享元模式(Flyweight)
- JAVA设计模式——享元模式(Flyweight)
- java设计模式--结构型模式--享元模式
- Java设计模式二十二:享元模式(Flyweight)
- java设计模式---享元模式
- Java设计模式之十一(享元模式)
- java23种设计模式--享元模式(flyweight)
- Java设计模式之——享元模式
- java设计模式——享元模式
- java设计模式---享元模式
- java设计模式---享元模式
- java设计模式之享元模式(11)
- JAVA设计模式之享元模式