加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长资讯 > 传媒 > 正文

那你知道如此强大的Stream的实现原理吗?

发布时间:2021-02-16 15:52:47 所属栏目:传媒 来源:互联网
导读:## 单例模式 单例模式是指,某个类负责创建自己的对象,同时确保只能创建单个对象。单例模式最简单的设计模式,也是最容易用错的设计模式。 ### 如何实现单例模式 单例模式非常简单,这个模式中只包含一个类。实现单例模式的重点是管理单例实例的创建。 + C+

## 单例模式

单例模式是指,某个类负责创建自己的对象,同时确保只能创建单个对象。单例模式最简单的设计模式,也是最容易用错的设计模式。

### 如何实现单例模式

单例模式非常简单,这个模式中只包含一个类。实现单例模式的重点是管理单例实例的创建。

+ 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”的单例类提供。静态方法只提供单一的功能,并且调用时的写法比单例模式更加简洁。但须注意,只有逻辑上与某个类有紧密联系的功能才适合作为静态方法。静态方法如果滥用,会导致软件结构实际上变成了面向过程的设计。

## 观察者模式

观察者模式,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。又称订阅模式、事件模式等。

### 观察者模式的组成

观察者模式中包含两个角色:


(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读