PHP高级程序设计 学习笔记 2014.06.11

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

单例模式

当需要保证某个对象只能有一个实例的时候,单例模式非常有用。它把创建对象的控制权委托到一个单一的点上,任何时候应用程序都只会仅有一个实例存在。单例类不应该可以在类的外部进行实例化一个单例类应该具备以下几个要素。

必须拥有一个访问级别为 private 的构造函数,有效防止类被随意实例化。

必须拥有一个保存类的实例的静态变量。

必须拥有一个访问这个实例的公共的静态方法,该方法通常被命名为 GetInstance()。

必须拥有一个私有的空的__clone方法,防止实例被克隆复制。

下面用一个简单的单例类的例子来说明

class ClassName
{ public static $_instance; private function __construct()
{
# code...
} private function __clone()
{
# empty
} public static function GetInstance()
{
if(!(self::$_instance instanceof self))
{
self::$_instance = new self();
}
return self::$_instance;
} public function SayHi()
{
echo "Hi boy!";
}
} $App= ClassName::GetInstance();
$App->SayHi(); /**
*
* Output
*
* Hi boy!
*
*/

简单工厂模式

当你有大量的实现同一接口的类的时候,在合适的时候实例化合适的类,如果把这些 new 分散到项目的各个角落,不仅会使业务逻辑变的混乱并且使得项目难以维护。这时候如果引进工厂模式的概念,就能很好的处理这个问题。我们还可以通过应用程序配置或者提供参数的形式让工厂类为我们返回合适的的实例。

工厂类,它把实例化类的过程放到各工厂类里头,专门用来创建其他类的对象。工厂模式往往配合接口一起使用,这样应用程序就不必要知道这些被实例化的类的具体细节,只要知道工厂返回的是支持某个接口的类可以很方便的使用了。下面简单举例说明下工厂类的使用。

interface ProductInterface
{
public function showProductInfo();
} class ProductA implements ProductInterface
{
function showProductInfo()
{
echo 'This is product A.';
}
}
class ProductB implements ProductInterface
{
function showProductInfo()
{
echo 'This is product B.';
}
} class ProductFactory
{
public static function factory($ProductType)
{
$ProductType = 'Product' . strtoupper($ProductType);
if(class_exists($ProductType))
{
return new $ProductType();
}
else
{
throw new Exception("Error Processing Request", 1); } }
}
//这里需要一个产品型号为 A 的对象
$x = ProductFactory::factory('A');
$x -> showProductInfo();

//这里需要一个产品型号为 B 的对象
$o = ProductFactory::factory('B');
$o -> showProductInfo(); //都可以调用showProductInfo方法,因为都实现了接口 ProductInterface.
?>

小结

模式就像是软件工程的基石脉络像大厦的设计图纸一样,这里接触了两种模式:单例模式和工程模式。单例类中存在一个静态变量保存着自身的一个实例,并且提供了获取这个静态变量的静态方法。单例类还应该把构造函数和clone函数标记为私有的,防止破换实例的唯一性。工厂模式根据传入的参数或程序的配置来创建不同的类型实例,工厂类返回的是对象,工厂类在多态性编程实践中是至关重要的。

最新文章

  1. Socket
  2. 搜索框js样式(通用型)
  3. 重构第20天 提取子类(Extact SubClass)
  4. 泛函编程(13)-无穷数据流-Infinite Stream
  5. angular 依赖注入
  6. hibernate annotation注解方式来处理映射关系
  7. JS对象的写法
  8. facebook登录(集成FBSDKLoginKit) result的isCancelled总是YES token为nil
  9. python数据库操作之pymysql模块和sqlalchemy模块(项目必备)
  10. 【Xamarin挖墙脚系列:卸载不彻底的解决】
  11. c++中使用c语言函数
  12. mac版Tomcat安装
  13. 1592: [Usaco2008 Feb]Making the Grade 路面修整
  14. mysql 5.7 root密码重置(centos 7)
  15. 三、spring cloud 服务提供与调用
  16. 安卓开发学习笔记(三):Android Stuidio无法引用Intent来创建对象,出现cannot resolve xxx
  17. 设计模式---行为变化模式之访问器模式(Visitor)
  18. [解决]CXF wsdl2java 生成代码存在的一些问题
  19. POJ 2408 - Anagram Groups - [字典树]
  20. Ubuntu 16.04安装JDK并配置环境变量-【小白版】

热门文章

  1. .Net多线程编程—并发集合
  2. ASP.NET Core 1.1.0 Release Notes
  3. 关于这段时间学习 EntityFramework的 一点感悟
  4. ASP.NET是如何在IIS下工作的
  5. 【原】Github+Hexo+NextT搭建个人博客
  6. ABP文档 - Mvc 控制器
  7. .net 大型分布式电子商务架构说明
  8. “RazorEngine.Templating.TemplateParsingException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理 其他信息: Expected model identifier.
  9. 我的屌丝giser成长记-工作篇之B公司
  10. iOS开发--ChildViewController实现订单页的切换