zoukankan      html  css  js  c++  java
  • PHP设计模式 -- 工厂模式

    概念

    1、工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤。
    2、很多高级模式都是依赖于工厂模式。
    3、提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

    好处

    1、PHP中能够创建基于变量内容的类的新实例,减少主代码流中的基于条件复杂性;
    2、同时如果类发生改变不需要所有的地方进行修改,只需要在工厂中进行修改
    3、(无论对象被修改或者添加其他对象,Factory对象调用方式仍让是相同的)(集中实例化)

    应用场景

    1、做支付接口的时候,未来可能对应不同的支付网关:支付宝、财付通、网银在线等。
    2、方便未来扩展,设计成工厂模式。定一个专门生产网关接口的工厂,抽象出来, 3、做成接口形式,让所有的子类都要实现它的接口。
    4、以后加一个支付方式,要使用哪一种支付方式,改变一下参数即可。
    5、在为用户注册的时候,分为很多种角色的用户。
    6、比如册用户,匿名用户、管理员用户等。完全使用可以使用工厂的思想来实现, 7、代码也容易维护,为每种角色可以生成操作的类等等。
    8、系统对接多个不同类型的数据库,mysql,oracle,sqlserver

    示例代码

    简单工厂模式Factory,提供一个工厂方法供客户端调用。可能违反开闭原则。
    <?php
    
    // 定义一个接口
    interface Db
    {
      public function conn();
    }
    /**
     *@class 服务端开发(不知道谁将会被调用)
     *
     */
    class Dbmysql implements Db{
        public function conn() {
            echo '连接上了Mysql';
        }
    }
    class Dbsqlite implements Db{
        public function conn() {
            echo '连接上了sqlite';
        }
    }
    
    /**
     *@class 简单工厂,工厂方法
     *
     */
    class Factory{
        public static function  createDb($type = '') {
            if($type == 'mysql') {
                return new dbmysql();
            }elseif($type == 'sqlite') {
                return new dbsqlite();
            }else{//报错
                throw new Exception("Error db type", 1);
            }
        }
    }
    
    /**
     *@class 客户端看不到dbmysql dbsqlite内部细节的,只是知道接口
     */
    //只知道服务端开放了一个Factory::createDb()方法
    //方法只允许传递数据库名称,如果新增一个oracle需要修改Factory(比较麻烦)
    //面向对象设计法则中,重要的开闭原则--对于修改是封闭的,对于扩展是开放的。
    $db = Factory::createDb('mysql');
    $db = Factory::createDb('sqlite');
    $db->conn();

    示例二: 通过传入不同参数

    class CdFactory
    {
            public static function create($type)
            {
                $class = strtolower($type) . "CD";
                return new $class;
            }
    }
    //通过传入不同的参数来实例化不同的对象;统一在工厂类中进行实例化
    $type = 'enhanced';
    $cd = CdFactory::create($type);
    $type = '';
    $my_cd = CdFactory::create($type);

    示例3、抽象工厂模式

    概念:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
    <?php 
    
    interface TV{
      public function open();
      public function use();
    }
    
    class HaierTv implements TV
    {
      public function open()
      {
          echo "Open Haier TV <br>";
      }
    
      public function use()
      {
          echo "I'm watching TV <br>";
      }
    }
    
    interface PC{
      public function work();
      public function play();
    }
    
    class LenovoPc implements PC
    {
      public function work()
      {
          echo "I'm working on a Lenovo computer <br>";
      }
      public function play()
      {
          echo "Lenovo computers can be used to play games <br>";
      }
    }

    class ProductFactory { public static function createTV() { return new HaierTv(); } public static function createPc() { return new LenovoPc(); } } $newTv = ProductFactory::createTV(); $newTv->open(); $newTv->use(); $newPc = ProductFactory::createPc(); $newPc->work(); $newPc->play();
  • 相关阅读:
    Hbase常用Shell命令
    Hbase的安装与基本操作
    Unity3d 游戏设计(一)井字棋
    Unity3d 二、离散仿真引擎基础
    Unity3D 一、游戏
    String StringBuffer StringBulider
    Java日志记录log4j最简明教程
    使用PinYin4j.jar将汉字转换为拼音
    线性素数筛
    求一个数的约数个数 d(n)
  • 原文地址:https://www.cnblogs.com/chenhaoyu/p/9063380.html
Copyright © 2011-2022 走看看