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
Oct 09 PHP
PHP&MYSQL服务器配置说明
Oct 09 PHP
初品cakephp 入门基础
Feb 16 PHP
php中explode与split的区别介绍
Oct 03 PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 PHP
php统计文章排行示例
Mar 04 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
PHP网络操作函数汇总
May 18 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
PHP对称加密函数实现数据的加密解密
Oct 27 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
Jun 02 PHP
Yii框架自定义数据库操作组件示例
Nov 11 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垃圾回收机制引用计数器概念分析
2013/06/24 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
windows下安装php的memcache模块的方法
2015/04/07 PHP
php数组随机排序实现方法
2015/06/13 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
JS的replace方法介绍
2012/10/20 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
2016/05/25 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
[55:42]VG vs VGJ.T 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
python3爬虫之设计签名小程序
2018/06/19 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
python可以用哪些数据库
2020/06/22 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
社会学专业学生职业规划书
2014/02/07 职场文书
高中生班主任评语
2014/04/25 职场文书
信访维稳承诺书
2015/05/04 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android