php 工厂模式和策略模式区别

工厂是创建型模式,它的作用就是创建对象;

策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;

关注点不一样

一个关注对象创建

一个关注行为的封装(推荐学习:PHP视频教程

解决不同的问题

工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。

策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。

工厂相当于黑盒子,策略相当于白盒子;

实例:

<?php

header('content-type:text/html;charset=utf-8');

abstract class Product {

    abstract public function getName();

}

class ProductA extends Product  {

    public function getName() {

        echo '这是A商品<br>';

    }

}

class ProductB extends Product {

    public function getName() {

    echo '这是B商品<br>';

    }

}

//工厂模式

class ProductFactory {

    public static function create($num) {

        switch($num) {

            case 1:

            return new ProductA();

            case 2:

            return new ProductB();

        }

        return null;

    }

}

//传递不同的参数获取不同的对象

$obj=ProductFactory::create(1);

$obj->getName(); //这是A商品

$obj=ProductFactory::create(2);

$obj->getName(); //这是B商品



//=======策略模式

<?php

header('content-type:text/html;charset=utf-8');

interface IStrategy {

    function ontheway();

    }

class Walk implements IStrategy {

    public function ontheway() {

        echo '走着去<br>';

    }

}

class Bick implements IStrategy {

    public function ontheway() {

        echo '骑自行车去<br>';

    }

}

class Bus implements IStrategy {

    public function ontheway() {

        echo '坐巴士去<br>';

    }

}

//策略模式,传递不同的参数,调用不同的策略

class Strategy{

    public function getWay(IStrategy $obj) {

        $obj->ontheway();

    }

}

$obj=new Strategy();

$obj->getWay(new Walk); //走着去

$obj->getWay(new Bick); //骑自行车去

$obj->getWay(new Bus); //坐巴士去

来源
php 工厂模式和策略模式区别
其他设计模式

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

你这是广告吧?

1年前 评论
kis龍 (作者) 1年前
my38778570 (楼主) 1年前
kis龍 (作者) 1年前
my38778570 (楼主) 1年前
kis龍 (作者) 1年前
my38778570 (楼主) 1年前
my38778570 (楼主) 1年前
╰ゝSakura

你居然发blog,声望都被你赚了,我巨亏啊 到时候别人要高声望才给offer,我不巨亏?

1年前 评论
my38778570 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!