package com.cheng.zenofdesignpatterns.patterns.flyweight;
import android.view.View;
import com.cheng.zenofdesignpatterns.ZoDPChapterBaseActivity;
import com.cheng.zenofdesignpatterns.patterns.flyweight.signup.SignInfo;
import com.cheng.zenofdesignpatterns.patterns.flyweight.signup.SignInfoFactory;
public class ZoDPFlyweightActivity extends ZoDPChapterBaseActivity {
@Override
protected void initData() {
mTitleTV.setText("享元模式");
String content = "定义:\n" +
"Use sharing to support large numbers of fine-grained objects efficiently.\n" +
"使用共享对象可有效地支持大量的细粒度的对象。\n\n" +
"对象信息的内部状态和外部状态:\n" +
"- 内部状态\n" +
"是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变,它们可以作" +
"为一个对象的动态附加信息,不必直接存储在具体某个对象中,属于可以共享的部分。\n" +
"- 外部状态\n" +
"是对象得以依赖的一个标记,是随环境改变而改变的、不可以共享的状态,它是一批对象" +
"的统一标识,是唯一的一个索引值。\n\n" +
"享元模式的优缺点\n" +
"享元模式是一个非常简单的模式,它可以大大减少应用程序创建的对象,降低程序内存的" +
"占用,增强程序的性能,但它同时也提高了系统的复杂性,需要分离出外部状态和内部状" +
"态,而且外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱。\n\n" +
"使用场景\n" +
"- 系统中存在大量的相似对象\n" +
"- 细粒度的对象都具备较接近的外部状态,而且外部状态与环境无关,也就是说对象没有特" +
"定身份\n" +
"- 需要缓冲池的场景\n\n" +
"享元模式的扩展\n" +
"1. 线程安全问题\n" +
"该问题没什么可以参考的标准,只有依靠经验,在需要的地方考虑一下线程安全,在大部分" +
"场景下都不用考虑。在使用享元模式时,对象池中的享元对象尽量多,多到足够满足业务为止。\n" +
"2. 性能平衡\n" +
"尽量使用Java基本类型作为外部状态(String类型也是可以考虑的)。\n\n" +
"最佳实践\n" +
"Flyweight是拳击比赛中的特有名词,意思是‘特轻量级’,指的是51公斤级比赛,用到设计" +
"模式中是指我们的类要轻量级,粒度要小,这才是它要表达的意思。粒度小了,带来的问题" +
"就是对象太多,那就用共享技术来解决。";
mContentTV.setText(content);
}
@Override
public void onClick(View v) {
// 1. 模拟报名时候高并发访问生成大量对象
//初始化对象池
for(int i=0;i<4;i++){
String subject = "科目" + i;
//初始化地址
for(int j=0;j<30;j++){
String key = subject + "考试地点"+j;
SignInfoFactory.getSignInfo(key);
}
}
SignInfo signInfo = SignInfoFactory.getSignInfo("科目1考试地点1");
}
}