[关闭]
@a5635268 2016-02-29T11:57:57.000000Z 字数 2231 阅读 1148

【PHP的设计模式专题(1)】工厂模式

PHP 设计模式


意图

定义一个用于创建对象的接口(工厂方法),通过这个方法去决定实例什么类。而这个实例什么类,又通过另外的一个工厂方法实例化延迟到其子类;

结构图

Factory.jpg-24.2kB

不同的产品通过不同的工厂加工,然后再通过一个统一的工厂返回最终的结果。

优点和缺点

优点: 工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
缺点: 客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类

适用场合

在同一操作下实现不同的内部逻辑:比如 实例数据库链接对象的方法,可以实例不同类型的数据库

代码示例

Example1

  1. /**
  2. * 抽象工厂角色
  3. */
  4. interface Creator {
  5. public function factoryMethod();
  6. }
  7. /**
  8. * 具体工厂角色A
  9. */
  10. class ConcreteCreatorA implements Creator {
  11. /**
  12. * 工厂方法 返回具体 产品A
  13. * @return ConcreteProductA
  14. */
  15. public function factoryMethod() {
  16. return new ConcreteProductA();
  17. }
  18. }
  19. /**
  20. * 具体工厂角色B
  21. */
  22. class ConcreteCreatorB implements Creator {
  23. /**
  24. * 工厂方法 返回具体 产品B
  25. * @return ConcreteProductB
  26. */
  27. public function factoryMethod() {
  28. return new ConcreteProductB();
  29. }
  30. }
  31. /**
  32. * 抽象产品角色
  33. */
  34. interface Product {
  35. public function operation();
  36. }
  37. /**
  38. * 具体产品角色A
  39. */
  40. class ConcreteProductA implements Product {
  41. /**
  42. * 接口方法实现 输出特定字符串
  43. */
  44. public function operation() {
  45. echo 'ConcreteProductA <br />';
  46. }
  47. }
  48. /**
  49. * 具体产品角色B
  50. */
  51. class ConcreteProductB implements Product {
  52. /**
  53. * 接口方法实现 输出特定字符串
  54. */
  55. public function operation() {
  56. echo 'ConcreteProductB <br />';
  57. }
  58. }
  59. class Client {
  60. /**
  61. * Main program.
  62. */
  63. public static function main() {
  64. $creatorA = new ConcreteCreatorA();
  65. $productA = $creatorA->factoryMethod();
  66. $productA->operation();
  67. $creatorB = new ConcreteCreatorB();
  68. $productB = $creatorB->factoryMethod();
  69. $productB->operation();
  70. }
  71. }
  72. Client::main();

Example2

  1. /**
  2. * 工厂方法模式
  3. * 定义一个用于创建对象的接口,让子类决定将哪一个类实例化,使用一个类的实例化延迟到其子类
  4. */
  5. /*
  6. class DBFactory{
  7. public static function create($type){
  8. swtich($type){
  9. case "Mysql":
  10. return new MysqlDB();
  11. case "Postgre":
  12. return new PostgreDB();
  13. case "Mssql":
  14. return new MssqlDB();
  15. }
  16. }
  17. }
  18. # 面向对象设计原则: http://developer.51cto.com/art/201206/340930.htm
  19. # 面向对象的主要原则就是: 把修改关闭,把扩展打开;如果不使用工厂模式,我们每增加一个数据库类型就要修改源码,这不符合面向对象的设计原则
  20. */
  21. //具体工厂
  22. class DBFactory{
  23. public static function create($type){
  24. $class = $type . "DB";
  25. return new $class;
  26. }
  27. }
  28. //抽象产品
  29. interface DB{
  30. public function connect();
  31. public function exec();
  32. }
  33. //具体产品1
  34. class MysqlDB implements DB{
  35. public function __construct(){
  36. echo "mysql db<br/>";
  37. }
  38. public function connect(){
  39. }
  40. public function exec(){
  41. }
  42. }
  43. //具体产品2
  44. class PostgreDB implements DB{
  45. public function __construct(){
  46. echo "Postgre db<br/>";
  47. }
  48. public function connect(){
  49. }
  50. public function exec(){
  51. }
  52. }
  53. //具体产品3
  54. class MssqlDB implements DB{
  55. public function __construct(){
  56. echo "mssql db<br/>";
  57. }
  58. public function connect(){
  59. }
  60. public function exec(){
  61. }
  62. }
  63. # client
  64. $oMysql = DBFactory::create("Mysql");
  65. $oPostgre = DBFactory::create("Postgre");
  66. $oMssql = DBFactory::create("Mssql");
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注