又称为蝇量模式,即运用共享技术有效的支持大量细粒度的对象。
享元模式有点类似于单例模式,都是只生成一个对象被共享使用。享元模式主要目的就是让多个对象实现共享,减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗。
【外部状态和内部状态】
- 内部状态是可以共享的,存储在享元内部,不会随环境的改变而有所不同。
- 外部状态是不可以共享的,它随环境的改变而改变的,因此外部状态是由客户端来保持(因为环境的变化是由客户端引起的)。
【角色】
- 抽象享元角色(Flyweight):为具体享元角色规定了必须实现的方法,而外部状态就是以参数的形式通过此方法传入。可以由抽象类、接口来担当。
- 具体享元角色(ConcreteFlyweight):实现抽象角色规定的方法。如果存在内部状态,就负责为内部状态提供存储空间。
- 享元工厂角色(FlyweightFactory) :负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键。
客户端角色(Client):维护对所有享元对象的引用,而且还需要存储对应的外蕴状态。
/*** 颜色*/public class Color {private String name;public Color(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
/*** 形状*/public interface Shape {void show(Color color);}
/*** 形状类*/public class ShapeImpl implements Shape {/*** 内部享元部分*/private String type;public ShapeImpl(String type) {this.type = type;}/*** 外部享元角色(Color)*/@Overridepublic void show(Color color) {System.out.println("绘制出:" + type + ",颜色为:" + color.getName());}}
/*** 形状工厂类*/public class ShapeFactory {private Map<String, Shape> shapeMap = new HashMap<>();/*** 获取形状类对象* @return*/public Shape getShape(String type) {if (!shapeMap.containsKey(type)) {shapeMap.put(type, new ShapeImpl(type));}return shapeMap.get(type);}/*** 获取对象个数* @return*/public Integer size() {return shapeMap.size();}}
public class FlyweightTest {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();Shape shape1 = shapeFactory.getShape("长方形");Shape shape2 = shapeFactory.getShape("正方形");Shape shape3 = shapeFactory.getShape("圆形");Shape shape4 = shapeFactory.getShape("长方形");shape1.show(new Color("绿色"));shape2.show(new Color("白色"));shape3.show(new Color("篮色"));shape4.show(new Color("红色"));System.out.println("对象总数:" + shapeFactory.size());}}----输出----绘制出:长方形,颜色为:绿色绘制出:正方形,颜色为:白色绘制出:圆形,颜色为:篮色绘制出:长方形,颜色为:红色对象总数:3
