对象的状态分为两种:
内蕴状态:
不会随着环境的改变而改变,因此存储在对象内部
外蕴状态:
会随着环境的改变而改变,因此通过方法参数的形式传递给对象
比如水果的名称和价格是水果的内蕴状态;水果的重量是水果的外蕴状态。
享元模式通过共享,避免重复创建内容相同的对象,从而节省内存。
在享元模式中,被共享的对象是享元对象。客户端不会直接创建享元对象,必须通过享元工厂来创建,客户端需要给享元工厂提供要创建的享元对象的内蕴状态。享元工厂首先根据客户端提供的内蕴状态查找自己的缓存,如果曾经创建过内容相同的享元对象,则将它返回给客户端;否则享元工厂使用这个内蕴状态创建享元对象,然后把它存储到自己的缓存中,最后将它返回给客户端。
享元模式和单例模式的区别是:
如果程序运行期间,一个类只有一个实例,那么应该使用单例模式
如果一个类有多个实例,但是不存在内容相同的实例,那么应该使用享元模式
抽象享元角色
为所有具体享元角色定义公共的接口,外蕴状态通过方法参数的形式传递给享元对象
具体享元角色(单纯享元角色)
继承或实现抽象享元角色,需要保存内蕴状态
复合享元角色(很少使用)
不可以被共享,但可以被分解成多个可被共享的单纯享元对象
享元工厂
负责创建和管理具体享元对象,享元工厂通常是单例的