初学设计模式

23种设计模式

学一下吧

今年八股太卷了, 只会工厂和单例的二狗被虐的好惨

打算先跟着leetcode看一下, 再看看K_Eckel

六大设计原则

开闭原则: 对修改封闭, 对扩展开放

单一职责原则: 一个类只做一件事, 一个类应该只有一个引起它修改的原因

里氏替换原则: 子类应该可以完全替换父类 也就是说在使用继承时, 只扩展新功能, 而不要破坏父类原有的功能

依赖倒置原则: 细节应该依赖于抽象, 抽象不应依赖于细节 把抽象层放在程序设计的高层, 并保持稳定, 程序的细节变化由低层的实现层来完成

迪米特法则: 又名“最少知道原则”, 一个类不应知道自己操作的类的细节

接口隔离原则: 客户端不应依赖它不需要的接口

工厂模式

梦开始的地方

关于工厂模式讲的太多了, 讲讲为什么用工厂模式:

减少代码量

将具体的构造过程隐藏起来, 使调用者可以不用关注具体的构造过程, 降低代码耦合

延迟了具体化的操作

工厂模式有三种:

简单工厂模式

工厂方法模式

抽象工厂模式

简单工厂

image-20221205231216188
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
构建一个工厂
class Factory{
static public Base* creat(type)
{
switch(type)
{
case Derive_1 :
...
return new Derive_1();
case Derive_2 :
...
return new Derive_2();
case Derive_n :
...
return new Derive_n();

}
}
};

调用者
Base* a = Factory::creat(type);

简单工厂模式弊端

如果需要生产的产品过多,此模式会导致工厂类过于庞大,承担过多的职责,变成超级类, 违背了单一职责原则。

要生产新的产品时,必须在工厂类中添加新的分支。而开闭原则告诉我们:类应该对修改封闭。我们希望在添加新功能时,只需增加新的类,而不是修改既有的类,所以这就违背了开闭原则。

工厂方法模式

这个看起来就很神奇

为每一个类创建一个工厂, 把复杂的构造隐藏起来, 同时又减轻了简单工厂模式成为 “超级类” 的情况

在新建一个类时, 只需要新建对应的工厂类就可以啦

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Derive_1_Factory{
static public Base* creat()
{
.....
return new Derive_1();
}
};

class Derive_2_Factory{
static public Base* creat()
{
.....
return new Derive_2();
}
};

调用者
Base* a = Derive_1_Factory::creat();
Base* b = Derive_2_Factory::creat();

看起来和直接调用构造函数好像差不多的样子

抽象工厂模式

那么,