php 3种基本设计模式的组合使用

1.1 工厂模式,工厂方法或者类生成对象,而不是在代码直接new

    class Factory{
        static function getDatabase(){
            return new Mysql($host, $user, $pass);
        }
    }
    #使用
    Factory::getDatabase();

1.2 单例模式,使某个类的对象仅运行创建一个

  • 1.有个私有的静态对象变量,专门存放本类的对象
  • 2.有个静态的方法来创建对象
  • 3.有个私有的构造函数,防止外部new对象
  • 4.有个clone方法,防止clone return false

    参考文章单例模式

class Database {
    //单一对象属性
    private static $instance;
    //定义一些全局变量需要存放属性
    private $props = array();  

    //私有的构造方法
    private function __construct(){
        echo ‘into construct! 该类不允许外部创建对象
        ‘;
    }  

    //返回单一实例
    public static function getInstance () {
        //判断是否已经有了实例化的对象
        if(empty(self::$instance)) {
            //可以被override (动态解析)
            self::$instance = new static();
            //不可以被override (静态解析)
            //self::$instance = new self();
        }  

        return self::$instance;
    }  

    public function __clone(){
        return ‘该类禁止clone‘;
    }

    //设置属性
    public function setProperty ( $key, $value) {
        $this->props[$key] = $value;
    }  

    //获取属性
    public function getPeoperty ( $key ) {
        return $this->props[$key];
    }
}  

//使用
$dbObj = Database::getInstance();
$dbObj->setProperty(‘root_path‘,‘/www‘);
$dbObj->setProperty(‘tmp_path‘,‘/tmp‘);  

//接下来删除该单例对象,如果还能获取到刚刚添加的属性,说明使用的是同一个对象
unset($dbObj);  

$dbObj = Database::getInstance();
echo $dbObj->getPeoperty(‘root_path‘);
echo $dbObj->getPeoperty(‘tmp_path‘);  

1.3 注册模式,全局共享和交换对象

  • 1.将同一个需要多次使用对象统一注册添加别名,统一调用使用, (比如客户买一个机器肯定是去工厂认定的机构去买,而不是每个人都去工厂去买)
  • 2.当下一次想使用一个对象的时候,不需要使用工厂,也不需要使用单例模式,直接在注册器上获取就可以了
    class Register (){
        protected static $objects;

        function set($alias, $object){
            self::$objects[$alias] = $objects;
        }

        function get($alias){
            return self::$objects[$alias];
        }

        function _unset($alias){
            unset(self::$objects[$alias]);
        }
    }

2.总结使用

    class Factory{
        static function getDatabase(){
            //单例模式获取数据对象
            $dbObj = Database::getInstance();
            //注册到全局树上
            Register::set(‘db1‘, $dbObj);
        }
    }
    #使用
    //第一次主文件里面
    Factory::getDatabase();
    //以后使用数据库对象直接访问
    Register::get(‘db1‘);

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-17 20:48:22

php 3种基本设计模式的组合使用的相关文章

10.设计模式_组合模式

转载自   http://www.cnblogs.com/zhili/p/CompositePattern.html 一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象在功能上区别,导致在操作过程中必须区分简单对象和复合对象,这样就会导致客户调用带来不必要的麻烦,然而作为客户,它们希望能够始终一致地对待简单对象和复合对象.然而组合模式就是

简述23种软件设计模式

简述23种软件设计模式 一.设计模式分类 总体来说设计模式分为三大类: 五种创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 七种结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 十一种行为型模式:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 二.设计模式概述 创建型模式 1.工厂方法模式 工厂方法模式的创建是因为简单工厂模式有一个问题,在简单工厂模式

设计模式 之 组合

组合模式(Composite) 将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 在我们提高班,有这样的一个组织,它不属于具体的哪一期,只属于整个提高班,那就是我们的机房管理委员会.无可厚非的是不管是哪个部门,大Boss都是我们尊敬的米老师.在这里我只表现出了我们每一期的分工结构.在机房管理委员会中,总负责人为九期-许恕,下面是十期总负责人-罗智福,然后下面是十期的四个部门负责人:网络部门:屈文哲:网线-交换机部门:孙一清和我:

C++设计模式实现--组合(Composite)模式

一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: #include <iostream> #include <list> #include <string> using namespace std; //公司类,提供接口 class Company { public: Company(string name) { m_nam

设计模式之组合模式(Composite)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

c++设计模式15 --组合模式

今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合模式的类图一本结构 想了很久,结合源代码,才搞明白,其实这个组合,意思就是说,如果我们要做这种树状结果,比如公司想让我们吧所有部门人员的 姓名,职位,薪水遍历出来,这个时候怎么办呢?那我们看树状机构图,有叶子结点和枝干结点,2种,但是2种有共性,那就是每个结点都有姓名,职位,薪水.所有叶子结点和枝干

23种JavaScript设计模式

原文链接:https://boostlog.io/@sonuton/23-javascript-design-patterns-5adb006847018500491f3f7f 转自: https://mp.weixin.qq.com/s?__biz=MzUxMzcxMzE5Ng==&mid=2247488996&idx=1&sn=c337e4cfe2a67550f5f22536d58a9735&chksm=f951a0a7ce2629b13bb306f9a2410e2be

C#设计模式(10)——组合模式(Composite Pattern)

一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象在功能上区别,导致在操作过程中必须区分简单对象和复合对象,这样就会导致客户调用带来不必要的麻烦,然而作为客户,它们希望能够始终一致地对待简单对象和复合对象.然而组合模式就是解决这样的问题.下面让我们看看组合模式是怎样解决这个问题的. 二.组合模式的详细介绍 2.1 组合模式的定义 组合模式

每天一个设计模式之组合模式

作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) 原文地址是:<每天一个设计模式之组合模式> 欢迎关注个人技术博客:godbmw.com.每周 1 篇原创技术分享!开源教程(webpack.设计模式).面试刷题(偏前端).知识整理(每周零碎),欢迎长期关注! 如果您也想进行知识整理 + 搭建功能完善/设计简约/快速启动的个人博客,请直接戳the