那你知道如此强大的Stream的实现原理吗?
## 单例模式 单例模式是指,某个类负责创建自己的对象,同时确保只能创建单个对象。单例模式最简单的设计模式,也是最容易用错的设计模式。 ### 如何实现单例模式 单例模式非常简单,这个模式中只包含一个类。实现单例模式的重点是管理单例实例的创建。 + C++,可以通过static局部变量的方式,也可以通过static指针成员变量的条件创建方式做到(即每次GetInstance的时候判空,如果为空则new,否则直接返回)。Java可以用static指针成员变量的方式。 + 通常为了避免使用者错误创建多余的对象,单例的构造函数和析构函数声明为私有函数。 + 多线程环境下,创建单例的代码需要谨慎处理并发的问题。一般做法是双重检查加锁(即每次判空的时候先判空一次,如果为空则加锁再次判空)。C++的静态局部变量可以保证线程安全,java要使用synchronized实现。 + 多种单例,如果有依赖关系,需要仔细处理构建顺序。C++的静态局部变量在程序首次运行到变量声明处时执行其构造函数。Java的静态变量初始化发生在类被加载时。 ### 单例模式的好处 + 使用简单,任何需要用到类实例的地方,直接用类的GetInstance()方法就便利的获取到实例。 + 可以避免使用全局变量,让开发者有更好的OOP感,且可以让程序员更好地控制初始化顺序。 + 它隐藏了对象的构建细节,且能避免多次构建引起的错误。 ### 单例模式的探讨 从原则上说,一个类应努力提供它应有的功能,而不应对它的使用者做出过多限制。而单例模式限制这个类的对象只存在唯一实例。因此单例模式只应在确有必要的情况下使用: + 技术上必须保证此对象全局唯一,例如代表应用本身、对象管理器、全局服务等。 + 程序中多处依赖此对象,采用单例模式能使代码得到极大简化,例如全局配置选项。 要避免根据一时的具体需求将某类设计为单例,而极大地限制了可扩展性。例如一个选课系统如果把学校信息设计为单例,将来想要支持跨校选课时就比较困难。 尤其注意,一旦某个类设计为单例,就会形成在程序各处随意地引用这个对象的一种倾向。这正是单例模式的便利之处,但如果并不希望一个类有如此广泛的耦合关系,则应避免将其设计为单例。 此外,由这种便利性会引发更不利的倾向。在未经仔细设计的系统中,随着需求变更和系统演进,单例类可能会无节制地扩展,包含各种难以归类的数据成员和各个模块的中转方法。 ### 替代方案 通常有以下方法可以避免使用单例模式: + 享元模式。例如Android SDK使用activity.getApplication() ,避免“Application.getSingleton() ”。这样取得Application实例并不像单例模式那么方便,从而限制了Application的耦合性。而通过Activity获取Application是符合逻辑的设计,大多数真正需要用到Application的场合并不影响使用。 + 静态方法。例如Unity引擎的物体查询接口是GameObject.Find(name) ,而不是由比如“GameObjectManager”的单例类提供。静态方法只提供单一的功能,并且调用时的写法比单例模式更加简洁。但须注意,只有逻辑上与某个类有紧密联系的功能才适合作为静态方法。静态方法如果滥用,会导致软件结构实际上变成了面向过程的设计。 ## 观察者模式 观察者模式,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。又称订阅模式、事件模式等。 ### 观察者模式的组成
观察者模式中包含两个角色: (编辑:济源站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |