设计模式详解 PHP版
  • 设计模式简介&原则
  • 常见设计模式
    • 工厂模式(Factory)
      • 简单工厂模式(Simple Factory)
      • 工厂方法模式(Factory Method)
      • 抽象工厂模式(Abstract Factory)
      • 三种工厂模式对比
    • 单例模式(Singleton)
      • 场景*memcache操作类
    • 注册树模式
    • 适配器模式(Adapter)
    • 策略模式(Strategy)
    • 数据对象映射模式
    • 观察者模式(observer)
    • 原型模式(Prototype)
    • 装饰器模式(Decorator)
    • 迭代器模式 (Iteration)
    • 桥接模式(Bridge)
    • 建造者模式(Builder)
    • 命令行模式(Command)
    • 组合模式(Composite)
    • 外观模式(Facade)
    • 享元模式(Flyweight)
    • 解释器模式(Interpreter)
    • 中介者模式(Mediator)
    • 备忘录模式(Memento)
    • 代理模式(Proxy)
    • 责任链模式(Responsibility Chain)
    • 状态模式(State)
    • 模板方法模式(Template Method)
    • 访问者模式(Visitor)
  • 资料
Powered by GitBook
On this page
  • 概述:
  • 模式核心思想
  • 模式架构图:
  • 模式架构简单代码实现示例:
  • 简单场景示例:

Was this helpful?

  1. 常见设计模式

单例模式(Singleton)

Previous三种工厂模式对比Next场景*memcache操作类

Last updated 6 years ago

Was this helpful?

概述:

单例模式(singleton)是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

模式核心思想

  • 1)保证一个类仅有一个实例;

  • 2)它必须自行创建这个实例;

  • 3)它必须自行向整个系统提供这个实例。

模式架构图:

模式架构简单代码实现示例:

mysql单例示例:

<?php
class Mysql
{
    //该属性用来保存实例
    private static $conn;
    //构造函数为private,防止外界实例化对象
    private function __construct()
    {
        $this->conn = mysql_connect('localhost','root','');
    }
    //创建一个用来实例化对象的方法
    public static function getInstance()
    {
        if (!(self::$conn instanceof self)) {
            self::$conn = new self;
        }
        return self::$conn;
    }
    //防止外界clone实例
    public function __clone(){
        trigger_error('Clone is not allowed !');
    }
}

//只能静态方式取得实例,不能new 和 clone
$mysql = Mysql::getInstance();

简单场景示例:

场景:假设现在有一个保存项目应用信息的类AppInfo,我们可以用它来保存如项目名称、项目的网址、项目版本等。这些信息在你每次调用时候都可能有所不同。原因是它是可以被系统中其他无关对象进行设置。

如果我们使用传递类对象的方式实现,会产生耦合,而且还必须使所有的对象实例都使用的同一个AppInfo对象(保证数据一致)。

故如下代码:

<?php
class AppInfo
{
    private $props = array();

    private static $instance;

    //防止外界实例化对象
    private function __construct()
    {
    }
    //防止外界clone实例
    private function __clone()
    {
    }AppInfo

    public static function getInstance()
    {
        if (empty(self::$instance)) {
            self::$instance = new self;
        }

        return self::$instance;
    }

    public function setProperty($key, $val)
    {
        $this->props[$key] = $val;
    }

    public function getProperty($key)
    {
        return $this->props[$key];
    }
}

$info = AppInfo::getInstance();
$info->setProperty("name","xiaoxiami");
unset($info);
$info2 = AppInfo::getInstance();
echo $info2->getProperty("name");//输出xiaoxiami  key为name的属性值并没有丢失。