又称为蝇量模式,即运用共享技术有效的支持大量细粒度的对象。

    享元模式有点类似于单例模式,都是只生成一个对象被共享使用。享元模式主要目的就是让多个对象实现共享,减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗。

    【外部状态和内部状态】

    • 内部状态是可以共享的,存储在享元内部,不会随环境的改变而有所不同。
    • 外部状态是不可以共享的,它随环境的改变而改变的,因此外部状态是由客户端来保持(因为环境的变化是由客户端引起的)。

    【角色】

    • 抽象享元角色(Flyweight):为具体享元角色规定了必须实现的方法,而外部状态就是以参数的形式通过此方法传入。可以由抽象类、接口来担当。
    • 具体享元角色(ConcreteFlyweight):实现抽象角色规定的方法。如果存在内部状态,就负责为内部状态提供存储空间。
    • 享元工厂角色(FlyweightFactory) :负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键。
    • 客户端角色(Client):维护对所有享元对象的引用,而且还需要存储对应的外蕴状态。

      1. /**
      2. * 颜色
      3. */
      4. public class Color {
      5. private String name;
      6. public Color(String name) {
      7. this.name = name;
      8. }
      9. public String getName() {
      10. return name;
      11. }
      12. public void setName(String name) {
      13. this.name = name;
      14. }
      15. }
      1. /**
      2. * 形状
      3. */
      4. public interface Shape {
      5. void show(Color color);
      6. }
      1. /**
      2. * 形状类
      3. */
      4. public class ShapeImpl implements Shape {
      5. /**
      6. * 内部享元部分
      7. */
      8. private String type;
      9. public ShapeImpl(String type) {
      10. this.type = type;
      11. }
      12. /**
      13. * 外部享元角色(Color)
      14. */
      15. @Override
      16. public void show(Color color) {
      17. System.out.println("绘制出:" + type + ",颜色为:" + color.getName());
      18. }
      19. }
      1. /**
      2. * 形状工厂类
      3. */
      4. public class ShapeFactory {
      5. private Map<String, Shape> shapeMap = new HashMap<>();
      6. /**
      7. * 获取形状类对象
      8. * @return
      9. */
      10. public Shape getShape(String type) {
      11. if (!shapeMap.containsKey(type)) {
      12. shapeMap.put(type, new ShapeImpl(type));
      13. }
      14. return shapeMap.get(type);
      15. }
      16. /**
      17. * 获取对象个数
      18. * @return
      19. */
      20. public Integer size() {
      21. return shapeMap.size();
      22. }
      23. }
      1. public class FlyweightTest {
      2. public static void main(String[] args) {
      3. ShapeFactory shapeFactory = new ShapeFactory();
      4. Shape shape1 = shapeFactory.getShape("长方形");
      5. Shape shape2 = shapeFactory.getShape("正方形");
      6. Shape shape3 = shapeFactory.getShape("圆形");
      7. Shape shape4 = shapeFactory.getShape("长方形");
      8. shape1.show(new Color("绿色"));
      9. shape2.show(new Color("白色"));
      10. shape3.show(new Color("篮色"));
      11. shape4.show(new Color("红色"));
      12. System.out.println("对象总数:" + shapeFactory.size());
      13. }
      14. }
      15. ----输出----
      16. 绘制出:长方形,颜色为:绿色
      17. 绘制出:正方形,颜色为:白色
      18. 绘制出:圆形,颜色为:篮色
      19. 绘制出:长方形,颜色为:红色
      20. 对象总数:3