千锋教育-做有情怀、有良心、有品质的职业教育机构
用过哪些设计模式? 谈谈自己比较熟悉的设计模式
链接: 学习资料网站.
创建型:工厂方法、抽象工厂、单例、原型、生成器
结构型:代理、外观、组合、适配器、装饰、桥接、享元
行为:迭代器、中介者、观察者、策略、状态、命令、访问者、模板方法、备忘录、责任链
1)工厂方法模式 面试题
在父类中提供一个创建对象的方法,在其子类中决定实例化对象的类型。
优点:单一职责,开闭,里氏替换LSP,依赖抽象DIP,迪米特法则DP
缺点:每一次增加一个具体产品,都需要增加一个具体类和对应的具体工厂,代码复杂度就成倍增加,增加了系统具体类的依赖。
学习链接: 工厂方法模式.
2)抽象工厂模式:创建一系列相关的对象,而无需指定具体类。简记超级工厂创建其它工厂。
优点:单一职责、开闭、LSP、DIP、DP
缺点:引入众多接口和类,代码复杂度增加
抽象工厂通常基于一组工厂方法
3)单例模式 【面试题】
保证一个类只有一个实例,并提供一个访问实例的全局节点。
单例 (Singleton) 类声明了一个名为 getInstance获取实例的静态方法来返回其所属类的一个相同实例。
单例的构造函数必须对客户端 (Client) 代码隐藏。 调用获取实例方法必须是获取单例对象的唯一方式。
优点:解决了2个问题
缺点:违反单一职责原则,开闭原则。
Unity中的单例模式和不继承MonoBehaviord的普通单例模式。
应用例子:游戏中各种各样的管理器Manager
隐藏游戏体:obj.hideFlags = HideFlags.HideAndDontSave
链接: 我的两种单例模式代码.
4)状态模式 面试题
是一种行为设计模式,在对象的内部发生状态改变时改变其行为
解决大量if else 或者switch 多状态的情形
代码结构
客户端:新建具体状态,并且调用具体行为
状态控制器:状态属性,转换状态方法,调用状态的具体行为
状态父类或接口:控制器属性,设置控制器方法(保存控制器),抽象行为
具体状态:继承状态,重写为具体行为
链接: 参考资料代码.
优点:单一、开闭、控制器和父类状态封装,只需要注重具体状态类行为修改。易于维护和扩展、减少因新增状态对原因脚本进行大量修改,每个状态只需要维护自己,多项目开发、易于维护
缺点:状态较少的情况下就小题大做
举个例子:场景状态,主场景状态,加载场景状态,战斗场景状态,3个场景的切换
5)观察者模式 【面试题】
是一种行为设计模式,允许你定义一种订阅通知机制
代码结构
发布者:当新事件发生后,向其他对象发送自己所订阅的事件,发送通知方法。
订阅者接口:声明了通知方法Update更新
具体订阅者:可以执行一些操作来响应发布者的消息。
客户端:分别创建发布者和订阅者对象,然后为订阅者注册发布者更新
优点:开闭,迪米特法则,建立对象之间联系,数据松耦合
缺点:通知顺序是随机的
中介者和观察者相似
6)中介者模式
是一种行为设计模式,减少对象之间混乱无序的依赖关系,对象之间通过中介者对象进行合作。现实世界:飞机塔台调度
代码结构
N个组件:各种包含业务逻辑的类
中介者接口:接口申明了与组件的交流方式,通知
具体中介者:封装了多种组件间的关系。
组件并不知道其它组件的情况,组件如果发生变化,通知中介者,然后判断并发送给相应的其它组件。接受者和发送者不知道谁来处理请求和谁发出的请求
优点:单一、开闭、减少个组件的依赖关系,复用各个组件
相关推荐