PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式


Posted in PHP onJune 12, 2014

毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

单例模式

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

必须拥有一个访问级别为 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函数标记为私有的,防止破换实例的唯一性。工厂模式根据传入的参数或程序的配置来创建不同的类型实例,工厂类返回的是对象,工厂类在多态性编程实践中是至关重要的。

PHP 相关文章推荐
php在线生成ico文件的代码
Oct 09 PHP
PHP 第三节 变量介绍
Apr 28 PHP
php防注入及开发安全详细解析
Aug 09 PHP
php中怎么搜索相关联数组键值及获取之
Oct 17 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
Mar 15 PHP
Laravel中任务调度console使用方法小结
May 07 PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 PHP
php中的依赖注入实例详解
Aug 14 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 PHP
PHP7 字符串处理机制修改
Mar 09 PHP
PHP新手指南
Apr 01 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 #PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
Jun 12 #PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 #PHP
对PHP语言认识上需要避免的10大误区
Jun 12 #PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
Jun 12 #PHP
PHP微框架Dispatch简介
Jun 12 #PHP
PHP资源管理框架Assetic简介
Jun 12 #PHP
You might like
php 魔术方法使用说明
2009/10/20 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
详解Vue方法与事件
2017/03/09 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
2018/04/08 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
python根据文本生成词云图代码实例
2019/11/15 Python
python pyenv多版本管理工具的使用
2019/12/23 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
管理岗位竞聘演讲稿
2014/08/18 职场文书
士兵突击观后感
2015/06/16 职场文书
运动会运动员赞词
2015/07/22 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电