|
| 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 | + |
| 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 | + |
| 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