php设计模式是什么,该如何理解

做程序开发的朋友应该都听说过设计模式这个词,对于做java开发的,应该一听到这个词就明白是什么意思,但对于做PHP的朋友来说,往往越看越迷糊,那到底什么是设计模式呢?其实作者也不懂,下面是从网上摘抄的关于设计模式的一些解释,期待能够有一些理解.

php设计模式有如下:

备忘录模式(Memento模式)

观察者模式(Observer模式)

模板方法模式(Template Method模式)

命令模式(command模式)

合成模式(composite模式)

享元模式(flyweight模式)

策略模式(strategy模式)

状态模式(state模式)

适配器模式(adapter模式)

工厂方法模式(factory method模式)

原型模式(prototype模式)

门面模式(facade模式)

单例模式(singleton模式)

桥梁模式(bridge模式)

装饰器模式(decorator模式)

抽象工厂模式(abstract factory模式)

建造者模式(Builder模式)

访问者模式(Visitor模式)

当你在不断的试图从你的应用程序中发现新的特征时,你是否发现你提出的解决方法和一些以前你已经实现的东西是如此的类似呢?如果你是一个程序员(即使你才开始很短的时间),你都可能回答“是”,这看起来就是你使用了一些以前的代码来解决软件开发过程中新发现的问题了,你可能已经认识到:你的解决方法是基本原理,是一个不仅仅是你而且是所有专业开发者都能广泛重复应用的方法.

事实上,许多程序问题都不断的反复的遇到,而且许多用来解决这些问题的基本方法(或者说是设计模式)都已经浮现出来,设计模式就是一个教你如何利用真实可靠的设计来组织你的代码的模板.

设计模式历史

“设计模式”这个术语最初被设计用于建筑学领域,Christopher Alexander 在他1977的著作“A Pattern Language:Towns/Building/Construction”里面描述了一些常见的建筑学设计问题,并解释了如何用这些已有的,著名的模式集合来开始全新的有效的设计,Alexander的观点被很好的转化到软件开发上来,并且长期的用原有的组件来构造新的解决方案.

所有的设计模式都有一些常用的特性:一个标识(a name),一个问题陈述(a problem statement)和一个解决方案(a solution).

1、一个设计模式的标识是重要的,因为它会让其他的程序员不用进行太深入的学习就能立刻理解你的代码的目的(至少通过这个标识程序员会很熟悉这个模式)。

2、问题描述是用来说明这个模式的应用的领域。

3、解决方案描述了这个模型的执行。一个好的设计模式的论述应该覆盖使用这个模型的优点和缺点。

一个模式是解决特定问题的有效方法。一个设计模式不是一个库(能在你的项目中直接包含和使用的代码库)而是一个用来组织你的代码的模板。事实上,一个代码库和一个设计模式在应用上是有很多不同的。

比如,你从店铺里面买的一件衬衫是一个代码库,它的颜色,样式和大小都由设计师和厂商决定,但它满足了你的需求。然而,如果店里面没有什么衣服适合你,那你就能自己创建自己的衬衫(设计它的形状,选择布料,然后裁缝在一起)。但是如果你不是一个裁缝,你可能会发现自己很容易的去找一个合适的模式然后按着这个模式去设计自己的衬衫。使用一个模型,你可以在更少的时间内得到一个熟练设计的衬衫。

回到讨论软件上来,一个数据提取层或者一个CMS(content management system)就是一个库,它是先前设计好而且已经编码好了的,如果它能准确的满足你的需要那它就是一个好的选择。

工厂模式

工厂模式(Factory)允许你在代码执行时实例化对象,它之所以被称为工厂模式是因为它负责“生产”对象,工厂方法的参数是 你要生成的对象对应的类名称.

代码如下:Example #1 调用工厂方法(带参数)

  1. <?php
  2. class Example
  3. {
  4. // The parameterized factory method
  5. public static function factory($type)
  6. {
  7. if (include_once 'Drivers/' . $type . '.php') {
  8. $classname = 'Driver_' . $type;
  9. return new $classname;
  10. } else {
  11. throw new Exception ('Driver not found');
  12. }
  13. }
  14. }
  15. ?>

按上面的方式可以动态加载drivers,如果Example类是一个数据库抽象类,那么 可以这样来生成MySQL和 SQLite驱动对象:

  1. <?php
  2. // Load a MySQL Driver
  3. $mysql = Example::factory('MySQL');
  4. // Load a SQLite Driver
  5. $sqlite = Example::factory('SQLite');
  6. ?>

单例:单例模式(Singleton)用于为一个类生成一个唯一的对象,最常用的地方是数据库连接,使用单例模式生成一个对象后,该对象可以被其它众多对象所使用.

Example #2 单例模式

  1. <?php
  2. class Example
  3. {
  4. // 保存类实例在此属性中
  5. private static $instance;
  6. // 构造方法声明为private,防止直接创建对象
  7. private function __construct()
  8. {
  9. echo 'I am constructed';
  10. }
  11. // singleton 方法
  12. public static function singleton()
  13. {
  14. if (!isset(self::$instance)) {
  15. $c = __CLASS__;
  16. self::$instance = new $c;
  17. }
  18. return self::$instance;
  19. }
  20. // Example类中的普通方法
  21. public function bark()
  22. {
  23. echo 'Woof!';
  24. }
  25. // 阻止用户复制对象实例
  26. public function __clone()
  27. {
  28. trigger_error('Clone is not allowed.', E_USER_ERROR);
  29. }
  30. }
  31. ?>

这样我们可以得到一个独一无二的Example类的对象.

  1. <?php
  2. // 这个写法会出错,因为构造方法被声明为private
  3. $test = new Example;
  4. // 下面将得到Example类的单例对象
  5. $test = Example::singleton();
  6. $test->bark();
  7. // 复制对象将导致一个E_USER_ERROR.
  8. $test_clone = clone $test;
  9. ?>

最后一个想法:就象一个裁缝模型,一个设计本身而言是没有什么用处的,毕竟,你不可能穿一个服装模型,它仅仅是由很薄的纸拼凑起来的,类似的,一个软件设计模型也仅仅只是一个引导,它必须根据程序设计语言和你的应用程序的特点和要求而特别的设计.