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

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

使用简单工厂模式的步骤:
    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. 【leetocde】 105. Construct Binary Tree from Preorder and Inorder Traversal

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  2. 如何搭建个人博客网站(Mac)

    一直以为自己记忆力很好,毕业之后才发现,之前需要看一遍就能记住的东西,现在看两三遍才能有印象.而搞技术的,如果不及时的记录下当时的情景,过后很容易就忘记.所以,再次萌生了搭博客.写文章的想法(之前用D ...

  3. 【转】深入探讨 Java 类加载器

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html 类加载器是 Java 语言的一个创新,也是 Java ...

  4. unittest单元测试流程

    整理了一个单元测试的完整流程,觉得很不错. 一个 test case 类应该派生自 unittest.TestCase正常的的test case的调用顺序为 from __future__ impor ...

  5. JS中的运算符 以及变量和输入输出

    1.算术运算(单目运算符) + 加 .- 减.* 乘. / 除. % 取余.++ 自增.-- 自减. >>> +:有两种作用,链接字符串/加法运算,当+两边全为数字时,进行加法运算, ...

  6. Windbg调试互斥体(Mutex)死锁

    一. 测试代码 #include <windows.h> #include <tchar.h> #include <process.h> HANDLE hMutex ...

  7. PHP 字符串替换

    这是2017上半年的第一篇学习笔记,也是最后一篇,捂脸- 在前几天的工作中,关于"银行卡"页面原型如下,其中,不同银行卡的卡号只保留了最后四位数字可以显示,其他数字均用*字符隐藏了 ...

  8. Apache Kafka系列(五) Kafka Connect及FileConnector示例

    Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程 ...

  9. 问题: 数据流中位数 求解 时间复杂度度 java

    今天练习了一题: 数据流中位数 问题描述:数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数. 案例: 持续进入数组的数的列表为:[1, 2, 3, 4, 5],则返回[1 ...

  10. Django 学习笔记(七)数据库基本操作(增查改删)

    一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.p ...