设计模式-结构型模式之组合、享元设计模式

文章目录

    • 四、组合模式
    • 五、享元模式

四、组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象
组合模式依据树形结构来组合对象,用来表示部分以及整体层次。它创建了对象组的树形结构。
优点:

  1. 高层模块调用简单。
  2. 节点自由增加。

缺点:
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

举个例子:一个公司,从上到下分为,公司、部门、小组等,他们整个在一起才能称为一个完整的公司,要表示做个公司的结构,就可以采用组合设计模式。

下面使用程序演示下上面的例子:

  1. 定义属性类,用来表示不同层级的对象
@Data
public class Property {
   private String name;
   //下一层的子集
   private List<Property> next;

   public Property(String name) {
      this.name = name;
      next = new ArrayList<Property>();
   }
 
   public void add(Property e) {
      next.add(e);
   }
 
   public void remove(Property e) {
      next.remove(e);
   }
 
   public List<Property> getSubordinates(){
     return next;
   }
}
  1. 使用演示
public class demo {
   public static void main(String[] args) {
      Property company = new Property("公司");
      Property department = new Property("部门");
      Property group = new Property("小组");

      company.add(department);
      department.add(group);

      System.out.println(company);
   }
}

在这里插入图片描述

上面就演示了一个公司的组合,通过company对象就可以获得整个公司的各个部分的对象。组合设计模式主要适合于整体部分的场景。

五、享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。他的优点是大大减少对象的创建,降低系统的内存,使效率提高,但也有可能造成内存的浪费。比如Spring的采用容器的方式存储bean,使用时从容器中获取。

还是拿画不同颜色形状的例子演示下享元设计模式的使用:

  1. 定义形状的接口
public interface Shape {
   void draw();
}
  1. 定义圆形的实现,并接收一个颜色值:
public class Circle implements Shape {

    private String color;

    public Circle(String color) {
        this.color = color;
    }

    @Override
    public void draw() {
        System.out.println(StringFormatter.concat("开始画 ", color, " 色的圆 ").getValue());
    }
}
  1. 定义形状对象获取工厂,根据颜色值将对象存储到HashMap中,后再根据颜色值取对象,达到复用的效果。
public class ShapeFactory {

    private static final HashMap<String, Shape> circleMap = new HashMap<>();

    public static Shape getCircle(String color) {
        if (!circleMap.containsKey(color)) {
            System.out.println(StringFormatter.concat(">> 创建", color, "颜色的圆 ").getValue());
            circleMap.put(color, new Circle(color));
        }
        return circleMap.get(color);
    }
}
  1. 使用
public class demo {
    private static final String colors[] =
            {"Red", "Green", "Blue", "White", "Black"};

    public static void main(String[] args) {

        for (int i = 0; i < 20; ++i) {
            Shape circle = ShapeFactory.getCircle(getRandomColor());
            circle.draw();
        }
    }

    private static String getRandomColor() {
        return colors[(int) (Math.random() * colors.length)];
    }
}

设计模式-结构型模式之组合、享元设计模式_第1张图片

上面可以看出,享元设计模式可以大大减少对象的创建,但也有可以造成内存的浪费,比如某个对象的使用频率非常低,如果一直存在内存中就有点浪费空间了。

你可能感兴趣的:(实用工具及技术篇,Java之旅,设计模式)