设计模式六大原则
1.单一职责
- 最简单的面向对象设计原则,用于控制类的颗粒大小。
- 一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
- 单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则。
2.开闭原则
- 面向对象的可复用设计的基石,是最重要的面向对象的设计原则,也是面向对象的目标。
- 一个软件实体应该对拓展开放,对修改关闭。软件应该在拓展的时候尽可能不去修改源代码。
- 抽象化是开闭原则的关键,为实现开闭原则,C++提供了抽象类、多态等方法。
3.里氏替换原则
- 所有使用基类的地方必须能够透明的使用其子类对象。
- 一个软件将一个基类替换成子类对象,程序将不会产生任何的错误,反之则不####成立。
- 里氏替换原则是实现开闭原则的重要方式之一。
4.依赖倒置
- 抽象不应该依赖于细节,细节应当依赖于抽象。要针对接口编程,而不是针对于实现编程。
- 实现依赖倒置原则,我们应该针对抽象层编程,而将通过依赖注入的方法,注入到其他对象中。一般是通过抽象来注入所依赖的对象。
5.接口隔离
- 使用多个专门的接口,而不是使用单一的接口,客户端不应该依赖那些它不需要的接口。
- 一个接口相当于一个单独的角色,不该干的事情不要干,该干的事情必须干。
- 客户端应该将不需要的接口隐藏起来,如C++中的封装。不应该强迫用户使用那些他们不用的方法。
6.迪米特法则
- 一个软件实体应该尽可能少的与其他实体发生相互作用。
- 迪米特法则要求尽可能的降低系统的耦合度,使得类与类的之间保持松散的耦合关系。
- 减少两个对象的直接作用,可以通过引用一个第三者来降低现有对象的耦合度。
7.总结
- 单一职责讲的是写一个类与函数注意的点。
- 开闭原则与里氏替换原则,要求程序应该面向对象。
- 依赖倒住是面向对象的实现方法。
- 接口隔离强调封装的重要性。
- 迪米特法则要求类的设计应当尽量的松耦合,减少对象之间的交互。
常用设计模式
1.单例模式
- 关键点有四个
- 1.将构造函数设置为私有。
- 2.声明一个静态单例对象。
- 3.构造单例对象之前需要加锁。(必须锁柱对象,而非类型)
- 4.当前同时发生两次检测单例是否为空时,分别应该在锁之前与锁之后。(避免构造多个实例)
- 单例模式分为懒汉式和饿汉式。懒汉式是使用的时候进行创建。饿汉式直接创建静态实体,用的时候直接返回。
懒汉式
饿汉式
2.工厂模式
- 核心功能:根据需求生产产品。
- 核心思想:解耦需求、工厂和产品。
- 一般分为简单工厂、工厂和抽象工厂。
简单工厂
- 通过switch…case判断语句等操作来解析需求,没有做到工厂与产品的解耦和。、
- 优点:初步实现简单。
- 简单工厂中不同的产品都在同一个工厂进行胜场,随着产品增多,会多次去修改工厂里边 的代码。无法做到开闭原则,也不满足迪米特法则。
int prodNo;
class IProduct
{
public:
SimpleFactroy(int proNo)
{
this.prodNo=prodNo;
}
IProduct GetProduct()
{
switch(prodNo)
{
case 1:
return new ProductA();
case 2:
return new ProductB();
default:
return new ProductC();
}
}
}
//产品A
class ProductA: IProduct
{
//属性 ...
}
普通工厂
- 普通工厂将每个产品都写一个工厂,所有的产品派生于一个抽象的产品。
- 优点:让实现方法更加的面向对象。
- 缺点:是每增加一种产品就需要同时增加一个工厂类。当需求发生变化的时候只需要增删相应的类,不需要修改已经有的类。
interface IFactroy //工厂接口
{
IProduct GetProduct();
}
//A工厂类
class FactroyA:IFactroy
{
IProduct productA;
public:
FactroyA()
{
this.productA=new ProductA();
}
IProduct GetProduct()
{
return this.productA; //A工厂生产A产品
}
}
...B同理 //B工厂生产B产品
//产品A
class ProductA: IProduct
{
//属性...
}
...其他产品
抽象工厂
- 一个抽象工厂派生出不同的具体工厂,一个抽象产品派生不同的具体产品,每个工厂生产自己的产品族。
- 优点:工厂和产品都是面向对象编程了。
- 缺点:每次拓展新的产品类,需要修改所有的工厂以及抽象工厂的接口。
总结
- 为了适应程序的扩展性,简单工厂就衍生了普通工厂、抽象工厂等模式。每种模式有每种模式的优点,需要根据实际情况来进行选择。
3.观察者模式
- 在实际的开发中,出现一对多的依赖关系时,比如:一个守卫(观察者)看管多个囚犯。最简单的方法就是将这些对象绑定在一起,但是这样会造成程序耦合度较高。
- 主要实现是:将被观察者对象本身传给观察者,通过遍历的方式更新被观察者的状态。