设计模式——享元模式
2017-12-14 17:08
169 查看
个人理解:
1. 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
2. 享元模式可以看做是一个对象池,存放的都是单例对象,是不重复的,如果我们创建一个对象,正好对象池里面已经存在,就直接复用即可,不需要重新创建。如果创建的对象对象池里面没有,就创建一个对象加入这个对象池,方便下次使用。
3. 享元模式可分为:单纯享元模式、复合享元模式
(1)单纯享元:所有的享元对象都是单纯享元对象,也就是说都是可以直接共享的,单纯享元UML图如下:
(2)复合享元:将一些单纯享元使用合成模式加以复合,形成复合享元对象。这样的复合享元对象本身不能共享,但是组成复合享元的单纯享元可以内部共享。复合享元UML图如下:
4. 享元存储情况:
(1)单纯享元模式具体享元存储于享元工厂FlyweightFactory类的Map集合中;
(2)在示例代码中,复合享元模式的具体享元有两种存储情况:
a. 通过复合享元的addWord(String key) 存储,在复合享元中创建共享的单纯享元,仅在复合享元的Map集合中存储单纯享元
b. 通过复合享元的addWord(Word word) 存储,在享元工厂中创建共享的单纯享元,在享元工厂的Map集合&&复合享元的Map集合中都有存储单纯享元
5. 示例代码:
抽象享元:Flyweight:
具体享元ConcreteFlyweight(单纯享元、复合享元):
复合享元ConcreteCompositeFlyweight(复合享元):
享元工厂FlyweightFactory:
客户端调用:
运行结果:
12-14 17:42:09.842 1473-1473/com.wdp.designtest I/showWord: ------张华说:天王盖地虎------
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************单纯享元模式WorFactory中Word数量:1****************
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/showWord: ------张华说:宝塔镇河妖------
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************单纯享元模式WorFactory中Word数量:1****************
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/showWord: ------赵鹏说:玉帝X王母------
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************单纯享元模式WorFactory中Word数量:2****************
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************单纯享元模式是否可以共享对象:true****************
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------赵鹏说:吃葡萄不吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------张华说:吃葡萄不吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------李帅说:吃葡萄不吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************复合享元模式WorFactory wordC1中Word数量:3****************
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------赵鹏说:不吃葡萄倒吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------张华说:不吃葡萄倒吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------李帅说:不吃葡萄倒吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************复合享元模式WorFactory wordC2中Word数量:3****************
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************单纯享元模式WorFactory中Word数量:3****************
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************复合享元模式是否可以共享对象:false****************
1. 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
2. 享元模式可以看做是一个对象池,存放的都是单例对象,是不重复的,如果我们创建一个对象,正好对象池里面已经存在,就直接复用即可,不需要重新创建。如果创建的对象对象池里面没有,就创建一个对象加入这个对象池,方便下次使用。
3. 享元模式可分为:单纯享元模式、复合享元模式
(1)单纯享元:所有的享元对象都是单纯享元对象,也就是说都是可以直接共享的,单纯享元UML图如下:
(2)复合享元:将一些单纯享元使用合成模式加以复合,形成复合享元对象。这样的复合享元对象本身不能共享,但是组成复合享元的单纯享元可以内部共享。复合享元UML图如下:
4. 享元存储情况:
(1)单纯享元模式具体享元存储于享元工厂FlyweightFactory类的Map集合中;
(2)在示例代码中,复合享元模式的具体享元有两种存储情况:
a. 通过复合享元的addWord(String key) 存储,在复合享元中创建共享的单纯享元,仅在复合享元的Map集合中存储单纯享元
b. 通过复合享元的addWord(Word word) 存储,在享元工厂中创建共享的单纯享元,在享元工厂的Map集合&&复合享元的Map集合中都有存储单纯享元
5. 示例代码:
抽象享元:Flyweight:
public abstract class Word { String content; public String getContent() { return content; } public abstract void showWord(String str); }
具体享元ConcreteFlyweight(单纯享元、复合享元):
public class WordShow extends Word { public WordShow(String content) { this.content = content; } @Override public void showWord(String str) { Log.i("showWord", "------" + content + str + "------"); } }
复合享元ConcreteCompositeFlyweight(复合享元):
public class WordShowComplex extends Word { private Map<String , Word> wordMap = new HashMap(); @Override public void showWord(String str) { c609 Word word = null; for (String wordKey : wordMap.keySet()){ word = wordMap.get(wordKey); word.showWord(str); } } public void addWord(Word word){ wordMap.put(word.getContent(), word); } public void addWord(String key){ if (TextUtils.isEmpty(key)){ Log.i("getWordShow", "传入Key值为空"); return; } if (!wordMap.containsKey(key)){ wordMap.put(key, new WordShow(key)); } } public int getCount(){ return wordMap.size(); } }
享元工厂FlyweightFactory:
public class WordFactory { private Map<String, Word> wordMap = new HashMap<>(); WordShowComplex wordShowComplex; public Word getWordShow(String key){ if (TextUtils.isEmpty(key)){ Log.i("getWordShow", "传入Key值为空"); return null; } if (!wordMap.containsKey(key)){ wordMap.put(key, new WordShow(key)); } return wordMap.get(key); } public int getWordCounts(){ return wordMap.size(); } public Word getWordShowComplex(List<String> keyList){ wordShowComplex = new WordShowComplex(); for (String key : keyList){ wordShowComplex.addWord(new WordShow(key)); // wordShowComplex.addWord(key); } return wordShowComplex; } public int getWordShowComplexCount(){ return wordShowComplex.getCount(); } }
客户端调用:
private void factoryFlyweight(){ WordFactory wordFactory = new WordFactory(); Word wordA1 = wordFactory.getWordShow("张华说:"); wordA1.showWord("天王盖地虎"); Log.i("factoryFlyweight", "****************单纯享元模式WorFactory中Word数量:" + wordFactory.getWordCounts()+ "****************"); Word wordA2 = wordFactory.getWordShow("张华说:"); wordA2.showWord("宝塔镇河妖"); Log.i("factoryFlyweight", "****************单纯享元模式WorFactory中Word数量:" + wordFactory.getWordCounts()+ "****************"); Word wordB = wordFactory.getWordShow("赵鹏说:"); wordB.showWord("玉帝X王母"); Log.i("factoryFlyweight", "****************单纯享元模式WorFactory中Word数量:" + wordFactory.getWordCounts()+ "****************"); Log.i("factoryFlyweight", "****************单纯享元模式是否可以共享对象:" + (wordA1 == wordA2) + "****************"); List<String> words = new ArrayList<>(); words.add("张华说:"); words.add("李帅说:"); words.add("赵鹏说:"); Word wordC1 = wordFactory.getWordShowComplex(words); wordC1.showWord("吃葡萄不吐葡萄皮"); Log.i("factoryFlyweight", "****************复合享元模式WorFactory wordC1中Word数量:" + wordFactory.getWordShowComplexCount()+ "****************"); Word wordC2 = wordFactory.getWordShowComplex(words); wordC2.showWord("不吃葡萄倒吐葡萄皮"); Log.i("factoryFlyweight", "****************复合享元模式WorFactory wordC2中Word数量:" + wordFactory.getWordShowComplexCount()+ "****************"); Log.i("factoryFlyweight", "****************复合享元模式是否可以共享对象:" + (wordC1 == wordC2) + "****************"); } }
运行结果:
12-14 17:42:09.842 1473-1473/com.wdp.designtest I/showWord: ------张华说:天王盖地虎------
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************单纯享元模式WorFactory中Word数量:1****************
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/showWord: ------张华说:宝塔镇河妖------
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************单纯享元模式WorFactory中Word数量:1****************
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/showWord: ------赵鹏说:玉帝X王母------
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************单纯享元模式WorFactory中Word数量:2****************
12-14 17:42:09.843 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************单纯享元模式是否可以共享对象:true****************
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------赵鹏说:吃葡萄不吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------张华说:吃葡萄不吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------李帅说:吃葡萄不吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************复合享元模式WorFactory wordC1中Word数量:3****************
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------赵鹏说:不吃葡萄倒吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------张华说:不吃葡萄倒吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/showWord: ------李帅说:不吃葡萄倒吐葡萄皮------
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************复合享元模式WorFactory wordC2中Word数量:3****************
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************单纯享元模式WorFactory中Word数量:3****************
12-14 17:42:09.844 1473-1473/com.wdp.designtest I/factoryFlyweight: ****************复合享元模式是否可以共享对象:false****************
相关文章推荐
- 设计模式(享元模式)
- Java/Android 设计模式系列(13)--享元模式
- java设计模式之享元模式
- 设计模式——享元模式
- JAVA设计模式之享元模式
- 设计模式之享元模式的学习思考
- 设计模式:26 项目多也别傻做_享元模式
- 设计模式C++实现(9)——享元模式
- java设计模式13_享元模式
- C++设计模式——享元模式
- 【设计模式】享元模式
- 设计模式之享元模式
- [设计模式-结构型]享元模式(Flyweight )
- 设计模式(十)享元模式Flyweight(结构型)
- 设计模式Before-after之享元模式
- 设计模式之享元模式
- 设计模式 享元模式 FlyWeight
- C++设计模式-Flyweight享元模式
- python设计模式之享元模式
- 设计模式 笔记 享元模式 Flyweight