程序设计模式 - 单例和工厂

程序设计模式 - 单例和工厂

ID:40312352

大小:48.00 KB

页数:7页

时间:2019-07-30

程序设计模式 - 单例和工厂_第1页
程序设计模式 - 单例和工厂_第2页
程序设计模式 - 单例和工厂_第3页
程序设计模式 - 单例和工厂_第4页
程序设计模式 - 单例和工厂_第5页
资源描述:

《程序设计模式 - 单例和工厂》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、第三章单例模式和工厂模式/模式就像是OOP开发人员的配方,每种模式都提供了所需的成分。我们可以自定义6A21式的元素来解决特定的编程问题。模式对OOP开发人员尤其有用,因为它有助于创建稳定的API,并且仍然保持一定的灵活度。一种模式可以帮助我们定义负责完成特定任务的对象,还可以允许我们全部修改掉某个类而不用修改与这个类打交道的代码。前者被称为类的职责,后者被称为类的多态性。你也许已经在理论上学过这些概念,但本章将帮助你理解在应用程序中实现这些模式所需的PHP语法。本章将介绍两种常用的模式:单例模式和工厂模式。单例模式被当作职责模式,它用来在应

2、用程序中创建一个单一的功能访问点。工厂模式在多态性设计中非常重要。如果应用得当,工厂模式可以使得应用程序的移植性更好,类之间的依赖更松散,从而提高了灵活性。例如,通过工厂模式实现的多态性,我们就可以用一个新的试验性的类替换一个已经创建好的类,从而用一种安全稳定的方法来测试新的特性。3.1职责和单例模式在OOP中,一个对象只负责一个特定的任务通常是一种很好的做法。例如,你也许希望只让一个对象去访问数据库。单例模式被认为是职责模式,这是因为它将创建对象的控制权委托到一个单一的访问点上。在任何时候,应用程序中都只会有这个类仅有的一个实例存在。这可以

3、防止我们去打开数据库的多个连接或者不必要地使用多余的系统资源。在更加复杂的系统中,使用单例模式在维持应用程序状态的同步方面也尤其有用。所有的单例类至少拥有以下三种公共元素。它们必须拥有一个构造函数,并且必须被标记为private。它们拥有一个保存类的实例的静态成员变量。它们拥有一个访问这个实例的公共的静态方法。和普通类不同的是,单例类不能在其他类中直接实例化。单例类只能被其自身实例化。要获得这种限制效果,__construct()方法必须被标记为private。如果试图用private构造函数构造一个类,就会得到一个可访问性级别的错误。要让单

4、例类起作用,就必须使其为其他类提供一个实例,用它调用各种方法。单例类不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。结果是单例类不会重复占用内存和系统资源,从而让应用程序的其他部分更好地使用这些资源。作为这一模式的一部分,必须创建一个空的私有的__clone()方法,以防止对象被复制或者克隆。返回实例引用的这个方法通常被命名为getInstance()。这个方法必须是静态的,而且如果它还没有实例化,就必须进行实例化。getInstance()方法通过使用instanceof操作符和self关键字,可以检测到类是否已经初始化。如果保

5、存实例的静态成员为空或者还不是类自身的一个实例,那么这个实例将会被创建并保存到存放实例的变量中。代码清单3-1显示了用来封装数据库连接对象的一个单例类的例子。代码清单3-1数据库连接职责的集中控制classDatabase{private$_db;static$_instance;privatefunction__construct(){$this->_db=pg_connect('dbname=example_db');}private__clone(){};publicstaticfunctiongetInstance(){if(!(se

6、lf::$_instanceinstanceofself)){self::$_instance=newself();}returnself::$_instance;}publicfunctionquery($sql){//使用$this->_db执行一个查询returnpg_query($this->_db,$sql);}}这个例子一开始声明了两个变量:一个实例变量$_db,构造对象时这个变量的值会被填充;另外一个是静态变量$_instance,这个变量会保存类仅有的一个实例。接着是私有的__construct()和__clone()魔术方法

7、。私有构造函数可以防止外部代码使用new操作符来创建对象。类似地,私有的__clone()方法消除了PHP语言中可以复制对象从而破坏单一职责的一个漏洞。这之后的代码声明了getInstance()静态方法。这是单例模式的实际构造。这个函数会检查静态实例变量是否已保存这个类的一个实例。如果它没有包含自身的一个实例,类会被初始化并且保存到$_instance变量中。下一次调用这段代码时,$_instance变量会保存类的一个实例,并且这个类不会再次实例化。最后,这个方法会返回实例的引用。现在,你已经看到了如何生命单例类。但是应该如何使用它那?代码

8、清单3-2演示了从另外一个场景中使用单例类的做法。代码清单3-2使用单例类$db=Database:getInstance();$db->query(‘SELECT

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。