开发者社区> 余二五> 正文

设计模式学习笔记(1) - 简单工厂模式

简介:
+关注继续查看

  其实很早之前就已经了解一些设计模式了,后来弄了本《深入浅出设计模式》,读后还是有所不明。因为平时做开发大多是用的php,在应用设计模式的时候有个疑问:

  对于php这样的弱类型语言,设计模式是否全都适用?

  后来读到某篇关于设计模式的文章之后,其中有两个字把设计模式的核心思想给道了出来,就是:

  间接

  其实不论是工厂还是单例,或是修饰者,所有的设计模式都是以某种间接的方式来解决问题。刚好周末有点时间,我准备花点时间梳理一下经常用到的设计模式。

 

第一篇从工厂模式开始。工厂模式实际上是包含了三类:

  1. 简单工厂
  2. 工厂方法
  3. 抽象工厂

这三种模式实际上都是属于创建型的模式,从上至下依次变得复杂。

简单工厂

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

还是看代码来得更直观:


  1. // 产品类 
  2. abstract class Product  
  3.     abstract public function name(); 
  4.  
  5. // 已有的几个产品 
  6. class ProductA extends Product 
  7.     public function name()  
  8.     { 
  9.         echo "Product A\n"
  10.     } 
  11.  
  12. class ProductB extends Product 
  13.     public function name() 
  14.     { 
  15.         echo "Product B\n"
  16.     } 
  17.  
  18. // 工厂 
  19. class SimpleFactory  
  20.     public function product($product_name)  
  21.     { 
  22.         $class_name = "Product".$product_name
  23.         return new $class_name(); 
  24.     } 
  25.  
  26. // 测试,简单工厂会根据我们传入的参数动态的创建对象 
  27. $SimpleFactory = new SimpleFactory(); 
  28. $product = $SimpleFactory->product("A"); 
  29. $product->name(); 
  30.  
  31. $product = $SimpleFactory->product("B"); 
  32. $product->name(); 

输出结果:


  1. Product A 
  2. Product B 

从上面的代码可以看出,简单工厂实际上就是由一个工厂类来完成所有产品的实例创建。工厂在这里起到了间接的作用,我们不需要直接去实例化产品,仅需要指定参数让工厂去创建就好了。

需要注意的是,上面的例子并不是一般书上的例子,也不同于java中正规的例子,主要的变化在于工厂类中的product方法的实现:


  1. $class_name = "Product".$product_name
  2. return new $class_name(); 

按一般的书上的例子,这里应当是一堆switch case,然而php的特性允许我们直接用字符串来做类名,因此,避免了一般书上所说的简单工厂模式的缺点。

而在实际的php项目开发中,简单工厂模式应用的范围很广,也并不像书上所说的那样一无是处。










本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1032554,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
(二十八)monggodb和maven零散笔记
<span style="font-size:18px">   (1)maven导包的问题:当在pom.xml界面的Dependencies中点击add之后输入jar包查询条件后,如果确定条件没有输错,repo中也确实存在相关jar包,而并没有查处任何结果时,可以用以下方式处理:<br>     window-show view-other-maven-maven repositorie
1929 0
mongoose学习笔记2--增删改查1
查询 之前我们的集合已经创建成功,我们就先来进行第一步操作 —— 查询。 查询分很多种类型,如条件查询,过滤查询等等,今天只学习了最基本的find查询。 举例: 1.find查询: obj.find(查询条件,callback); Model.
838 0
mongoose学习笔记3--简单查询1
简述 查询就是返回一个集合中的文档的子集 Mongoose 模型提供了   find、     findOne、   findById 三种方法用于文档查询。 为了方便后面课程的有效学习,我们先添加一些测试数据。
697 0
+关注
20381
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载