Flyweight 享元模式
注:享元模式是结构型设计模式,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类).
很多细粒度对象,只用部分状态不同,大部分是相同的。为了减少内存开销,我们可以利用享元模式,通过一个对象来代替多个对象,实现需求。
享元模式中有个很经典的例子,字母的享元使用。
Java简单代码实现
字母类
package com.pattern.structure.flyweight; public class Letter { private String color ; private String name ; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void display() { System.out.println(color + " " + name); } }
字母工厂类
package com.pattern.structure.flyweight; import java.util.HashMap; import java.util.Map; public class LetterFactory { private static Map<String, Letter> letterMap = new HashMap<>() ; public static Letter getRedLetter(String letterName) { Letter letter = getLetter(letterName) ; letter.setColor("red"); return letter ; } public static Letter getBlackLetter(String letterName) { Letter letter = getLetter(letterName) ; letter.setColor("black"); return letter ; } public static Letter getLetter(String letterName) { Letter letter = null ; if(letterMap.containsKey(letterName) ) { letter = letterMap.get(letterName) ; } else { letter = new Letter() ; letter.setName(letterName); letterMap.put(letterName, letter) ; } return letter ; } public static int getObjectSize() { return letterMap.size() ; } }
客户端类
package com.pattern.structure.flyweight; public class Client { public static void main(String[] args) { Letter aRed = LetterFactory.getRedLetter("a") ; aRed.display(); Letter bRed = LetterFactory.getRedLetter("b") ; bRed.display(); Letter aBlack = LetterFactory.getBlackLetter("a") ; aBlack.display(); Letter bBlack = LetterFactory.getBlackLetter("b") ; bBlack.display(); System.out.println("object size: " + LetterFactory.getObjectSize()); } }
运行客户端程序可以看出,我们使用了4个对象,实际只创建了两个对象,如果颜色多种,效果更明显。
享元模式通用类图
------
文章只为技术交流学习,若所写有误,请斧正,评论或消息与我,为不误导后来学习的人;若有不小心所写侵权,请告知我;若转载,请注明出处。
松下问童子,言师采药去。
只言此山中,云深不知处。