Skip to content

Commit 2f61432

Browse files
committed
'增加设计模式'
1 parent 015c239 commit 2f61432

File tree

3 files changed

+244
-0
lines changed

3 files changed

+244
-0
lines changed

设计模式/Creational.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
## 工厂模式
2+
3+
### 1. 简单工厂
4+
5+
简单工厂就是一个工厂,只创建一个单一的类。不能创建其他的类,这就是简单工厂
6+
7+
```php
8+
class Factory {
9+
10+
public function create()
11+
{
12+
return new A();
13+
}
14+
}
15+
16+
```
17+
18+
这个简单的工厂只能创建A类。
19+
20+
### 2. 工厂方法
21+
22+
- [模式动机](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html#id16)
23+
24+
关于工厂模式的定义动机可以查阅[工厂模式](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html#id17)
25+
26+
我只写下自己的理解
27+
28+
有些时候,我们需要一个工厂创建不同的产品。比如军工厂既能创建子弹,又能创建枪。
29+
30+
工厂方法模式包含如下角色:
31+
32+
- Product:抽象产品
33+
- ConcreteProduct:具体产品
34+
- Factory:抽象工厂
35+
- ConcreteFactory:具体工厂
36+
37+
![../_images/FactoryMethod.jpg](http://design-patterns.readthedocs.io/zh_CN/latest/_images/FactoryMethod.jpg)
38+
39+
40+
41+
```php
42+
interface Ifactory{
43+
public function create($type);
44+
}
45+
46+
class Factory implements Ifactory{
47+
public function create($type){
48+
if($type == 'A') {
49+
return new A();
50+
} else if($type == 'B') {
51+
return new B();
52+
}
53+
}
54+
}
55+
```
56+
57+
### 3. 抽象工厂
58+
59+
[抽象工厂详细介绍](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html)
60+
61+
简单的个人理解:抽象工厂是为了创建不同的类型的产品。抽象出工厂。让不同的工厂创建不同的产品
62+
63+
举个例子。比如抽象军工厂。军工厂A生产枪,军工厂B生产子弹。
64+
65+
![../_images/AbatractFactory.jpg](http://design-patterns.readthedocs.io/zh_CN/latest/_images/AbatractFactory.jpg)
66+
67+
代码可以参考
68+
69+
[https://github.com/domnikl/DesignPatternsPHP/blob/master/Creational/AbstractFactory](https://github.com/domnikl/DesignPatternsPHP/blob/master/Creational/AbstractFactory)

设计模式/README.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
## 设计模式
2+
3+
> 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
4+
5+
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因
6+
7+
### 设计模式的类型
8+
9+
根据设计模式的参考书 **Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素)** 中所提到的,总共有 23 种设计模式。这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)
10+
11+
| 序号 | 模式 & 描述 | 包括 |
12+
| ---- | ------------------------------------------------------------ | ------------------------------------------------------------ |
13+
| 1 | **创建型模式** 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 | 工厂模式(Factory Pattern)抽象工厂模式(Abstract Factory Pattern)单例模式(Singleton Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern) |
14+
| 2 | **结构型模式** 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 | 适配器模式(Adapter Pattern)桥接模式(Bridge Pattern)过滤器模式(Filter、Criteria Pattern)组合模式(Composite Pattern)装饰器模式(Decorator Pattern)外观模式(Facade Pattern)享元模式(Flyweight Pattern)代理模式(Proxy Pattern) |
15+
| 3 | **行为型模式** 这些设计模式特别关注对象之间的通信。 | 责任链模式(Chain of Responsibility Pattern)命令模式(Command Pattern)解释器模式(Interpreter Pattern)迭代器模式(Iterator Pattern)中介者模式(Mediator Pattern)备忘录模式(Memento Pattern)观察者模式(Observer Pattern)状态模式(State Pattern)空对象模式(Null Object Pattern)策略模式(Strategy Pattern)模板模式(Template Pattern)访问者模式(Visitor Pattern) |
16+
17+
### 设计模式的六大原则
18+
19+
**1、开闭原则(Open Close Principle)**
20+
21+
开闭原则的意思是:**对扩展开放,对修改关闭**。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,
22+
23+
> 实现热插拔,提高扩展性。
24+
25+
**2、里氏代换原则(Liskov Substitution Principle)**
26+
27+
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
28+
29+
> 实现抽象的规范,实现子父类互相替换;
30+
31+
**3、依赖倒转原则(Dependence Inversion Principle)**
32+
33+
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
34+
35+
> 针对接口编程,实现开闭原则的基础;
36+
37+
**4、接口隔离原则(Interface Segregation Principle)**
38+
39+
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
40+
41+
> 降低耦合度,接口单独设计,互相隔离;
42+
43+
**5、迪米特法则,又称最少知道原则(Demeter Principle)**
44+
45+
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
46+
47+
> 功能模块尽量独立
48+
49+
**6、合成复用原则(Composite Reuse Principle)**
50+
51+
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
52+
53+
> 尽量使用聚合,组合,而不是继承;

设计模式/工厂模式.md

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
## 创造型
2+
3+
创建型中的模式,主要就是生产和创建类的,主要有工厂模式、单例模式、建造者模式、原型模式等
4+
5+
### 1. 简单工厂
6+
7+
简单工厂就是一个工厂,只创建一个单一的类。不能创建其他的类,这就是简单工厂
8+
9+
```php
10+
class Factory {
11+
12+
public function create()
13+
{
14+
return new A();
15+
}
16+
}
17+
18+
```
19+
20+
这个简单的工厂只能创建A类。
21+
22+
### 2. 工厂方法
23+
24+
- [模式动机](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html#id16)
25+
26+
关于工厂模式的定义动机可以查阅[工厂模式](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html#id17)
27+
28+
我只写下自己的理解
29+
30+
有些时候,我们需要一个工厂创建不同的产品。比如军工厂既能创建子弹,又能创建枪。
31+
32+
工厂方法模式包含如下角色:
33+
34+
- Product:抽象产品
35+
- ConcreteProduct:具体产品
36+
- Factory:抽象工厂
37+
- ConcreteFactory:具体工厂
38+
39+
![../_images/FactoryMethod.jpg](http://design-patterns.readthedocs.io/zh_CN/latest/_images/FactoryMethod.jpg)
40+
41+
42+
43+
```php
44+
interface Ifactory{
45+
public function create($type);
46+
}
47+
48+
class Factory implements Ifactory{
49+
public function create($type){
50+
if($type == 'A') {
51+
return new A();
52+
} else if($type == 'B') {
53+
return new B();
54+
}
55+
}
56+
}
57+
```
58+
59+
### 3. 抽象工厂
60+
61+
[抽象工厂详细介绍](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html)
62+
63+
简单的个人理解:抽象工厂是为了创建不同的类型的产品。抽象出工厂。让不同的工厂创建不同的产品
64+
65+
举个例子。比如抽象军工厂。军工厂A生产枪,军工厂B生产子弹。
66+
67+
![../_images/AbatractFactory.jpg](http://design-patterns.readthedocs.io/zh_CN/latest/_images/AbatractFactory.jpg)
68+
69+
代码可以参考
70+
71+
[https://github.com/domnikl/DesignPatternsPHP/blob/master/Creational/AbstractFactory](https://github.com/domnikl/DesignPatternsPHP/blob/master/Creational/AbstractFactory)
72+
73+
### 4. 建造者模式
74+
75+
详细表述可以参考[http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html)
76+
77+
- [模式动机](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id3)
78+
- [模式定义](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id4)
79+
- [模式结构](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id5)
80+
- [时序图](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id6)
81+
- [代码分析](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id7)
82+
- [模式分析](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id8)
83+
- [实例](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id9)
84+
- [优点](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id10)
85+
- [缺点](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id11)
86+
- [适用环境](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id12)
87+
- [模式应用](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id13)
88+
- [模式扩展](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id14)
89+
- [总结](http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html#id15)
90+
91+
个人理解
92+
93+
建造者模式的作用,就是将多个不同的对象组合成一个完成的对象。比如我们在盖房子的时候,需要水泥、钢筋、砖瓦等。工人把这些组合在一起就建成了一个房子。
94+
95+
### 5. 单例模式
96+
97+
单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
98+
99+
这个模式很好理解。就是一个对象的实例只在整个系统存在一次。比如我们链接数据库的时候,可以使用同一个链接。减少对数据库的链接,减轻数据库服务器压力。
100+
101+
```php
102+
class Singleton{
103+
private static $instance;
104+
private function __construct()
105+
{
106+
107+
}
108+
109+
public static function getInstance()
110+
{
111+
if(!self::$instance) {
112+
self::$instance = new Singleton();
113+
}
114+
return self::$instance;
115+
}
116+
117+
118+
119+
120+
}
121+
```
122+

0 commit comments

Comments
 (0)