1:细粒度、粗粒度
在项目中,粗细是相对的,粗粒度相当于抽象方法,只有一个轮廓,而没有具体的实现;细粒度是实现了某个抽象方法,有具体的操作。(只是结合面向对象开发的一个理解)
2:享元模式(Flyweight):运用共享技术有效的支持大量细粒度的对象。
(之所以说细粒度的,是因为每个实例都对细节有不同的实现,比如人吃饭,每个人每天都有这个动作,但吃的什么是不同的)
3:享元模式结构图
Flyweight类:它是所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态。
ConcreteFlyweight是集成Flyweight超类或实现Flyweight接口,并未内部状态增加存储空间。
UnsharedConcereteFlyweight是指那些不需要共享的Flyweight子类,因为Flyweight接口共享成为可能,但它不强制共享。
FlyweightFactory是一个享元工厂,用来创建并管理Flyweight对象,它主要是用来确保合理的共享Flyweight,用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话,这种方式是保证创建的实例是只有一个)。
4:内部状态与外部状态:
在享元对象内部并且不会随着环境改变而改变的共享部分,成为享元对象的内部状态,而随着环境改变而改变的、不可以共享的状态就是外部状态。
享元模式可以避免大量非常类似的开销,在程序设计中,有时需要生成大量细粒度的类实例来表示数据,如果能发现这些事例除了几个参数其他基本都是相同的,有时就能够接受大幅度的减少需要实例化的类的数量。如果能把那些参数移到实例的外面,在方法调用的时候将他们传递进来,就可以通过共享大幅度的减少单个实例的数目。
外部状态具体值得确认由客户端操作。
5:享元模式实现
//抽象的字符类
public abstract class Charactor{
//属性
protected char letter;
protected int fontsize;
//显示方法
public abstract void display();
//设置字体大小
public abstract void setFontSize(int fontsize);
}
//具体的字符类A
public class CharactorA extends Charactor{
//构造函数
public CharactorA(){
this.letter = 'A';
this.fontsize = 12;
}
//显示方法
public void display(){
try{
System.out.println(this.letter);
}catch(Exception err){
}
}
//设置字体大小
public void setFontSize(int fontsize){
this.fontsize = fontsize;
}
}
//具体的字符类B
public class CharactorB extends Charactor{
//构造函数
public CharactorB(){
this.letter = 'B';
this.fontsize = 12;
}
//显示方法
public void display(){
try{
System.out.println(this.letter);
}catch(Exception err){
}
}
//设置字体大小
public void setFontSize(int fontsize){
this.fontsize = fontsize;
}
}
//客户程序
public class ClinetTest{
public static void main(String[] args){
Charactor a = new CharactorA();
Charactor b = new CharactorB();
//设置字符A的大小
a.setFontSize(12);
//显示字符B
a.display();
//设置字符B的大小
b.setFontSize(14);
//显示字符B
b.display();
}
}
6:享元模式使用场景
(1)如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用
(2)对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以使用。
7:享元模式优缺点:
(1)优点
极大的减少了内存中实例的存在,解决了对象的开销问题
(2)缺点
享元模式使用外部状态,使程序的逻辑复杂化
8:享元模式总结
(1)享元模式核心在于享元对象的内部状态(共有属性或方法)和享元工厂(确保使用一个实例)。
(2)享元模式可以减少内存的对象实例,但也有其它不足,使用时要根据实际情况决定。