设计模式-结构型模式之组合、享元设计模式
文章目录
- 四、组合模式
- 五、享元模式
四、组合模式
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。
组合模式依据树形结构来组合对象,用来表示部分以及整体层次。它创建了对象组的树形结构。
优点:
- 高层模块调用简单。
- 节点自由增加。
缺点:
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
举个例子:一个公司,从上到下分为,公司、部门、小组等,他们整个在一起才能称为一个完整的公司,要表示做个公司的结构,就可以采用组合设计模式。
下面使用程序演示下上面的例子:
- 定义属性类,用来表示不同层级的对象
@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;
}
}
- 使用演示
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,使用时从容器中获取。
还是拿画不同颜色形状的例子演示下享元设计模式的使用:
- 定义形状的接口
public interface Shape {
void draw();
}
- 定义圆形的实现,并接收一个颜色值:
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());
}
}
- 定义形状对象获取工厂,根据颜色值将对象存储到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);
}
}
- 使用
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)];
}
}
上面可以看出,享元设计模式可以大大减少对象的创建,但也有可以造成内存的浪费,比如某个对象的使用频率非常低,如果一直存在内存中就有点浪费空间了。