工厂模式:使用工厂类使创建类与使用类分离,从而提高代码的易维护性,可扩展性等

工厂模式分位简单工厂模式工厂方法模式

使用简单工厂模式的步骤:
    1、创建父类及其子类
        父类中有[抽象]方法,在子类中实现。(父类可以是普通类,也可以是抽象类)
    2、创建工厂类
        有静态工厂方法,通过逻辑判断创建不同实例,返回父类类型
    例如://算法父类
                abstract class YunSuan{
                  abstract function YunSuan();
                }
                //加法的子类
                class Jia extends YunSuan{
                        function YunSuan(){
                                echo "这是加法";
                        }
                }
                //减法的子类
                class Jian extends YunSuan{
                        function YunSuan()    {
                            echo "这是减法";
                        }
                }
                //工厂类,通过逻辑判断创建不同实例
                class GongChang{
                    static function DuiXiang($f)    {
                        switch($f)        {
                            case "+":
                                return new Jia();
                                break;
                            case "-":
                               return new Jian();
                                break;
                        }
                  }
            }
            //测试
            $r = GongChang::DuiXiang("-");
            $r->YunSuan();
 
简单工厂模式对于扩展的实现挺好,但是修改的话就不是很方便,你需要在工厂类中添加逻辑判断等
 
使用工厂方法模式的步骤:
    1、创建父类及其子类
            //同上
    2、创建工厂类及其子类

工厂类中没有具体实现,通过子类实例化创建具体对象

        abstract class GongChang{

                    abstract static function DuiXiang();
        }
        //jia子类
        class jiafa extends GongChang{
            function DuiXiang(){
                return new jia();
            }
        }
        //jian子类
        class jianfa extends GongChang{
            function DuiXiang(){
                return new jian();
            }
        }
        //测试

$gc = new DuiXiang();

        $ys = $gc->jiafa();
        $ys->jia();


使用工厂方法模式就完全符合开闭原则了,针对扩展开放,针对修改关闭,不用去修改任何已有的代码,只需要添加子类或者删除子类就行了
 
 
 
单例模式:控制创建对象的个数

class DA{
  public $name;
  static private $dx;//存放对象的变量

  //将构造变为私有,外界没法造对象
  private function __construct(){
  }

  //提供一个造对象的方法
  static function CreateDX(){
    if(empty(self::$dx)){
    self::$dx = new DA();
    }
    return self::$dx;
  }
}

$d = DA::CreateDX();
$d1 = DA::CreateDX();
$d1->name = "lisi";

var_dump($d==$d1);

工厂模式 and 单例模式的更多相关文章

  1. PHP 设计模式 笔记与总结(6)基础设计模式:工厂模式、单例模式和注册树模式

    三种基础设计模式(所有面向对象设计模式中最常见的三种): ① 工厂模式:使用工厂方法或者类生成对象,而不是在代码中直接new 在 Common 目录下新建 Factory.php: <?php ...

  2. Spring中的工厂模式和单例模式

    Spring预备知识(适合中小型项目) 作用:集成和管理其他框架 工厂模式: A  a  = new A( ); 将类所要创建的对象写入工厂,统一进行管理 package com.spring; pu ...

  3. php设计模式 工厂模式和单例模式

    一.单例模式//让该类在外界无法造对象//让外界可以造一个对象,做一个静态方法返回对象//在类里面通过让静态变量控制返回对象只能是一个. 单例模式的要点有三个: 一是某个类只能有一个实例: 二是它必须 ...

  4. javascript工厂模式、单例模式

    //工厂模式 function createObject(name,age){ var obj = new Object(); obj.name = name; obj.age = age; obj. ...

  5. PHP设计模式-工厂模式、单例模式、注册模式

    本文参考慕课网<大话PHP设计模式>-第五章内容编写,视频路径为:http://www.imooc.com/video/4876 推荐阅读我之前的文章:php的设计模式 三种基本设计模式, ...

  6. Java ------ 工厂模式、单例模式

    工厂模式 简单工厂模式: 1.创建Car接口 public interface Car { public void drive(); } 2.创建两个实体类,分别实现Car接口 public clas ...

  7. php中的设计模式---工厂模式及单例模式

    这两个练习放在一起处理. 在python中,这些模式都有的. 要记得三大类模式:创建型,结构型,行为型. NotFoundException.php <?php namespace Bookst ...

  8. java23种设计模式(一)-- 工厂模式、抽象工厂模式和单例模式

    一.工厂模式 1.定义统一的接口,并在接口中定义要实现的抽象方法. 2.创建接口的具体实现类,并实现抽象方法. 3.创建一个工厂类,根据传递的参数,生成具体的实现类对象,执行具体的方法. 优点: 1. ...

  9. PHP设计模式笔记三:三种基本设计模式(工厂模式、单例模式、注册树模式) -- Rango韩老师 http://www.imooc.com/learn/236

    一.工厂设计模式 index.php $db = IMooc\Factory::createDatabase(); 使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改 ...

随机推荐

  1. 从源码理解Spring原理,并用代码实现简易Spring框架

    前言(本文为原创,转载请注明出处) 个人之前对于框架的学习,就停留在配置,使用阶段.说实话过段时间就会忘得荡然无存.也不知道框架的运行逻辑,就是知道添加个注解,就可以用了. 由于实习,时间比较多,也感 ...

  2. php面试题汇总一(基础篇附答案)

    一份不错的php面试题,附答案,有准备换工作的同学可以参考一下. 1:使用五种以上方式获取一个文件的扩展名要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,必须使用PHP ...

  3. 《DSOD:Learning Deeply Supervised Object Detectors from Scratch》翻译

    原文地址:https://arxiv.org/pdf/1708.01241 DSOD:从零开始学习深度有监督的目标检测器 Abstract摘要: 我们提出了深入的监督对象检测器(DSOD),一个框架, ...

  4. css盒子边框样式

    边框样式有全边框和单个边框样式,可对每条边设置不同的样式 如下代码P1为全边框样式,P2为单个边框设置不同的样式: <!DOCTYPE html> <html lang=" ...

  5. mysql为什么范围查询(>,<,between,%like,like%)之后的索引无效

    因为使用了范围索引,所以会使用满足范围的所有的值,也就是说存储引擎在这个时候会提取出满足之后条件的所有值,并遍历获取满足之后条件的值. http://www.itpub.net/thread-1901 ...

  6. CORS跨域资源共享你该知道的事儿

    "唠嗑之前,一些客套话" CORS跨域资源共享,这个话题大家一定不陌生了,吃久了大转转公众号的深度技术好文,也该吃点儿小米粥溜溜胃里的缝儿了,今天咱们就再好好屡屡CORS跨域资源共 ...

  7. Spring与Quartz的整合实现定时任务调度(转)

    最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考.我使用的是Maven来管理项目,需要的Jar包我给大家贴出 ...

  8. 包含常用功能的 gulpfile.js

    相关包安装 建议使用cnpm npm install --save-dev ***** 其中 ***** 部分表示所需要的包模块,如 gulpfile 中的 require('gulp-useref' ...

  9. Linux主分区,扩展分区,逻辑分区的联系和区别

    主分区,也称为主磁盘分区,和扩展分区.逻辑分区一样,是一种分区类型.主分区中不能再划分其他类型的分区,因此每个主分区都相当于一个逻辑磁盘(在这一点上主分区和逻辑分区很相似,但主分区是直接在硬盘上划分的 ...

  10. find the Nth highest salary(寻找第N高薪水)

    Suppose that you are given the following simple database table called Employee that has 2 columns na ...