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

 更新时间:2014年06月12日 10:06:13   投稿:hebedich  
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

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

单例模式

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

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

相关文章

  • YII Framework框架使用YIIC快速创建YII应用之migrate用法实例详解

    YII Framework框架使用YIIC快速创建YII应用之migrate用法实例详解

    这篇文章主要介绍了YII Framework框架使用YIIC快速创建YII应用之migrate用法,详细分析了migrate的功能与用法,并给出创建登录后台的实例讲述了migrate的相关使用技巧,需要的朋友可以参考下
    2016-03-03
  • 实例分析PHP将字符串转换成数字的方法

    实例分析PHP将字符串转换成数字的方法

    在本篇文章里我们给大家分享的是关于PHP将字符串转换成数字的方法和相关知识点,有兴趣的朋友们学习下。
    2019-01-01
  • 帝国cms常用标签汇总

    帝国cms常用标签汇总

    这篇文章主要给大家汇总介绍了一些帝国cms常用标签以及使用小技巧,非常的实用,这里推荐给大家。
    2015-07-07
  • 使用composer 安装 laravel框架的方法图文详解

    使用composer 安装 laravel框架的方法图文详解

    这篇文章主要介绍了使用composer 安装 laravel框架的方法,结合图文说明的形式详细分析了composer 安装 laravel框架的具体步骤、相关命令与操作注意事项,需要的朋友可以参考下
    2019-08-08
  • 完美解决在ThinkPHP控制器中命名空间的问题

    完美解决在ThinkPHP控制器中命名空间的问题

    下面小编就为大家带来一篇完美解决在ThinkPHP控制器中命名空间的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • ThinkPHP框架下整合支付宝支付功能图文教程

    ThinkPHP框架下整合支付宝支付功能图文教程

    这篇文章主要介绍了ThinkPHP框架下整合支付宝支付功能,结合图文形式详细分析了thinkPHP框架整合支付宝支付功能接口相关配置方法、操作技巧与相关注意事项,需要的朋友可以参考下
    2019-04-04
  • 常用PHP封装分页工具类

    常用PHP封装分页工具类

    这篇文章主要为大家详细介绍了常用PHP封装分页工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • 记Laravel调用Gin接口调用formData上传文件的实现方法

    记Laravel调用Gin接口调用formData上传文件的实现方法

    这篇文章主要介绍了记Laravel调用Gin接口调用formData上传文件的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • thinkPHP实现表单自动验证

    thinkPHP实现表单自动验证

    这篇文章主要介绍了如何使用thinkPHP实现表单自动验证,笔者也是菜鸟,一步步实验才得到的结果,这里给需要的朋友可以参考下
    2014-12-12
  • Laravel5.5 视图 - 创建视图和数据传递示例

    Laravel5.5 视图 - 创建视图和数据传递示例

    今天小编就为大家分享一篇Laravel5.5 视图 - 创建视图和数据传递示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10

最新评论