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

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

使用简单工厂模式的步骤:
    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. OpenStack(企业私有云)万里长征第六步——OpenStack网络及虚拟机存储位置

    一.前言 昨天又装了一遍OpenStack.码农这项工作就如同人生,永远有你想不到的意外在等着你,时而是惊喜时而是悲伤.在装的过程中倒是很顺利,只是在安装完成之后碰到了两个之前没有碰到的问题,这里记录 ...

  2. uploadify 在chrome上崩溃的解决办法

    使用Uploadify进行文件上传,Chrome经常会报“喔唷,崩溃啦”的错误,见下图: 很显然,这是Chrome浏览器缓存功能,所导致的问题.从LOG里也能看到:正常的情况下,会请求文件(jquer ...

  3. Linux命令的学习

    mkdir -p 创建目录 (make directorys) p递归创建 ls -l(long)d(direcitory)显示目录或者文件 cd 切换目录  从"/"开始目录,/ ...

  4. Fiddler获取https会话

    默认下,Fiddler不会捕获HTTPS会话,需要你设置下, 打开Fiddler  Tools--->Fiddler Options--->HTTPS 选项  选中checkbox,如上图 ...

  5. JavaScript之获取节点

    JavaScriopt DOM有三大节点:元素节点.属性节点.文本节点. 其中获取元素节点的三种主要方法有: 1.document.getElementById();此方法根据节点的唯一id值获取节点 ...

  6. Akka(19): Stream:组合数据流,组合共用-Graph modular composition

    akka-stream的Graph是一种运算方案,它可能代表某种简单的线性数据流图如:Source/Flow/Sink,也可能是由更基础的流图组合而成相对复杂点的某种复合流图,而这个复合流图本身又可以 ...

  7. 采用SmartQQ 协议可制作聊天机器人

    采用.NET CORE可运行在 Linux . Windows 和 Mac OSX 平台下. SmartQQ可以: 收发文字消息 获取好友.群.讨论组.好友分组和最近会话的列表 SmartQQ不可以: ...

  8. SLF4J源码解析-LoggerFactory(一)

    slf4j的含义为Simple logging facade for Java,其为简单的为java实现的日志打印工具,本文则对其源码进行简单的分析 JAVA调用SLF4J public class ...

  9. install redis

    1.Office Download redis.tar.gz  from website --- redis.io 2.uncompact file $ tar zxvf redis-3.2.9.ta ...

  10. 利用CoreAnimation实现一个时间的进度条

    (个人原创,转载请注明出处 http://www.cnblogs.com/pretty-guy/p/7460334.html) 在iOS中实现进度条通常都是通过不停的设置progress来完成的,这样 ...