1700474981
设计模式之禅 28.3 享元模式的应用
1700474982
1700474983
28.3.1 享元模式的优点和缺点
1700474984
1700474985
享元模式是一个非常简单的模式,它可以大大减少应用程序创建的对象,降低程序内存的占用,增强程序的性能,但它同时也提高了系统复杂性,需要分离出外部状态和内部状态,而且外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱。
1700474986
1700474987
1700474988
1700474989
1700474990
设计模式之禅 28.3.2 享元模式的使用场景
1700474991
1700474992
在如下场景中则可以选择使用享元模式。
1700474993
1700474994
❑系统中存在大量的相似对象。
1700474995
1700474996
❑细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份。
1700474997
1700474998
❑需要缓冲池的场景。
1700474999
1700475000
1700475001
1700475002
1700475004
设计模式之禅 28.4 享元模式的扩展
1700475005
1700475006
28.4.1 线程安全的问题
1700475007
1700475008
线程安全是一个老生常谈的话题,只要使用Java开发都会遇到这个问题,我们之所以要在今天的享元模式中提到该问题,是因为该模式有太大的几率发生线程不安全,为什么呢?
1700475009
1700475010
我们还以报考系统为例来说明这个问题。大家有没有想过,为什么要以考试科目+考试地点作为外部状态呢?为什么不能以考试科目或者考试地点作为外部状态呢?这样池中的对象会更少!可以!完全可以!我们把程序以考试科目为外部状态,把享元工厂稍作修改,如代码清单28-10所示。
1700475011
1700475012
代码清单28-10 报考信息工厂
1700475013
1700475014
public class SignInfoFactory{
1700475015
1700475016
//池容器
1700475017
1700475018
private static HashMap<String,SignInfo>pool=new HashMap<String,SignInfo>();
1700475019
1700475020
//从池中获得对象
1700475021
1700475022
public static SignInfo getSignInfo(String key){
1700475023
1700475024
//设置返回对象
1700475025
1700475026
SignInfo result=null;
1700475027
1700475028
//池中没有该对象,则建立,并放入池中
1700475029
[
上一页 ]
[ :1.70047498e+09 ]
[
下一页 ]