PHP面向对象程序设计(oop)学习笔记(三)-单例模式和工厂模式
毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
单例模式
当需要保证某个对象只能有一个实例的时候,单例模式非常有用。它把创建对象的控制权委托到一个单一的点上,任何时候应用程序都只会仅有一个实例存在。单例类不应该可以在类的外部进行实例化一个单例类应该具备以下几个要素。
必须拥有一个访问级别为private的构造函数,有效防止类被随意实例化。
必须拥有一个保存类的实例的静态变量。
必须拥有一个访问这个实例的公共的静态方法,该方法通常被命名为GetInstance()。
必须拥有一个私有的空的__clone方法,防止实例被克隆复制。
下面用一个简单的单例类的例子来说明
classClassName
{
publicstatic$_instance;
privatefunction__construct()
{
#code...
}
privatefunction__clone()
{
#empty
}
publicstaticfunctionGetInstance()
{
if(!(self::$_instanceinstanceofself))
{
self::$_instance=newself();
}
returnself::$_instance;
}
publicfunctionSayHi()
{
echo"Hiboy!";
}
}
$App=ClassName::GetInstance();
$App->SayHi();
/**
*
*Output
*
*Hiboy!
*
*/
简单工厂模式
当你有大量的实现同一接口的类的时候,在合适的时候实例化合适的类,如果把这些new分散到项目的各个角落,不仅会使业务逻辑变的混乱并且使得项目难以维护。这时候如果引进工厂模式的概念,就能很好的处理这个问题。我们还可以通过应用程序配置或者提供参数的形式让工厂类为我们返回合适的的实例。
工厂类,它把实例化类的过程放到各工厂类里头,专门用来创建其他类的对象。工厂模式往往配合接口一起使用,这样应用程序就不必要知道这些被实例化的类的具体细节,只要知道工厂返回的是支持某个接口的类可以很方便的使用了。下面简单举例说明下工厂类的使用。
interfaceProductInterface
{
publicfunctionshowProductInfo();
}
classProductAimplementsProductInterface
{
functionshowProductInfo()
{
echo"ThisisproductA.";
}
}
classProductBimplementsProductInterface
{
functionshowProductInfo()
{
echo"ThisisproductB.";
}
}
classProductFactory
{
publicstaticfunctionfactory($ProductType)
{
$ProductType="Product".strtoupper($ProductType);
if(class_exists($ProductType))
{
returnnew$ProductType();
}
else
{
thrownewException("ErrorProcessingRequest",1);
}
}
}
//这里需要一个产品型号为A的对象
$x=ProductFactory::factory("A");
$x->showProductInfo();
//这里需要一个产品型号为B的对象
$o=ProductFactory::factory("B");
$o->showProductInfo();
//都可以调用showProductInfo方法,因为都实现了接口ProductInterface.
小结
模式就像是软件工程的基石脉络像大厦的设计图纸一样,这里接触了两种模式:单例模式和工程模式。单例类中存在一个静态变量保存着自身的一个实例,并且提供了获取这个静态变量的静态方法。单例类还应该把构造函数和clone函数标记为私有的,防止破换实例的唯一性。工厂模式根据传入的参数或程序的配置来创建不同的类型实例,工厂类返回的是对象,工厂类在多态性编程实践中是至关重要的。
相关文章
- 【笔记php】如何使用PHP从JSON提取数据?
- Linux 查看 PHP 版本的方法(linux查php版本)
- 数据快速学习:使用 PHP 读取 MySQL 数据(php读取mysql)
- 学习PHP玩转MySQL数据库(php操作mysql方法)
- PHP 命名空间笔记详解编程语言
- 数据深入PHP:从MySQL获取表数据(php获取mysql表)
- MySQL验证:PHP实现细节(php验证mysql)
- 联合MySQL与PHP:双剑合璧(mysql与php)
- 学习PHP与MySQL:基础教程入门(php与mysql基础教程)
- 从头到尾:使用PHP进行MSSQL手工注入(php手工注入mssql)
- 深入学习Linux下的PHP编程技巧(linux下php编程)
- Linux 下学习 PHP 开发入门(linux下开发php)
- Linux上运行PHP文件的简单操作(linux运行php文件)
- 菜鸟学习Redis提升PHP运行效率(菜鸟 redis php)
- [FAQ]PHP中的一些常识:类篇
- 学习php笔记字符串处理
- PHP学习笔记之一
- php学习笔记之函数声明(二)
- php学习笔记面向对象中[接口]与[多态性]的应用
- php入门学习知识点三PHP上传
- php入门学习知识点七PHP函数的基本应用
- php教程插件机制在PHP中实现方案
- PHP获取和操作配置文件php.ini的几个函数介绍
- PHP面向对象程序设计(oop)学习笔记(二)-静态变量的属性和方法及延迟绑定
- PHP学习笔记(一)简单了解PHP
- PHP学习笔记(二)了解PHP的基本语法以及目录结构