前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP 常见设计模式——工厂模式

PHP 常见设计模式——工厂模式

作者头像
全栈程序员站长
发布2022-09-17 10:14:52
2930
发布2022-09-17 10:14:52
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

最近参加了几次面试,对于应用常见的几种设计模式问题,深有感触。为加强自身理解,同时也希望能给一些初级开发者一定的参考学习,决定开始就PHP常见的设计模式写下几篇博文,工作原因,会不定期更新,感谢您的耐心阅读!

今天这篇文章主要是描述一下PHP常见设计模式之工厂模式。工厂模式其实可以划分为:简单工厂模式、工厂方法模式、抽象工厂模式等。

1.简单工厂模式

简介:简单工厂模式又被称为静态工厂方法模式,属于设计模式中的类创建模式。官方解释为:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。一般用在具体产品很少扩展的情况下,不用经常修改,且不修改代码的话是不能实现扩展的。

优缺点:优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责;缺点在于工厂类不够灵活,增加新的产品时需要修改工厂类的代码,一旦产品较多时,工厂类将会变得异常复杂。

具体代码实例

代码语言:javascript
复制
<?php

class A
{
    function __construct()
    {
        echo "我是A类";
    }
}

class B
{
    function __construct()
    {
        echo "我是B类";
    }
}

class Factory
{
    public static function create($name)
    {
        if ($name == 'A') {
            return new A();
        } elseif ($name == 'B') {
            return new B();
        }
    }
}

$a = Factory::create('A');
$b = Factory::create('B');

2.工厂方法模式

简介:工厂方法模式通过定义了一个抽象出来的核心工厂类,并同时定义创建产品对象的接口,而创建具体实例的工作延迟到工厂子类中去完成。这种设计方式好处是核心类只需要关注工厂类的接口定义,具体的实例交由具体的工厂子类去创建。当需要新增一个产品时,无需修改现有的代码,只需要添加一个新的产品类和对应的工厂子类即可,促使整体的扩展性更好。

优缺点:基于其简介我们可以了解到,工厂方法模式是在简单工厂模式的基础上进一步的抽象,保留了简单工厂模式的优点,且解决了它的缺点。在工厂方法模式中,核心类仅仅负责给出具体工厂必须实现的接口,而无需再负责具体的产品类实例化,使得系统可以在不修改整体代码的情况下方便的引进新的产品。

具体代码实例

代码语言:javascript
复制
<?php

interface Basic
{
    public function actionOne();

    public function actionTwo();
}

class A implements Basic
{
    public function actionOne()
    {
        echo "我是A类—方法1";
    }

    public function actionTwo()
    {
        echo "我是A类—方法2";
    }
}

class B implements Basic
{
    public function actionOne()
    {
        echo "我是B类—方法1";
    }

    public function actionTwo()
    {
        echo "我是B类—方法2";
    }
}

abstract class Factory
{
    abstract static function createBasic();
}

class A_Factory extends Factory
{
    public static function createBasic()
    {
        return new A();
    }
}

class B_Factory extends Factory
{
    public static function createBasic()
    {
        return new B();
    }
}

$a = A_Factory::createBasic();
$a->actionOne();
$a->actionTwo();

$b = B_Factory::createBasic();
$b->actionOne();
$b->actionTwo();

3.抽象工厂模式

简介:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。此模式是在工厂方法模式上的进一步扩展。在工厂方法模式中,一个具体工厂负责一类具体产品的处理(一对一关系),但当我们需要一个工厂负责生成多种类型产品时,就要抽象整个工厂类了。

举一个具体生活实例

  • 产品结构:假设一个抽象类是手机,其子类有小米手机、华为手机、荣耀手机,那么抽象的手机和具体品牌的手机之间则构成了一个产品结构,抽象手机是父类,具体品牌手机是其子类。
  • 产品组:产品组是指由同一工厂生产,位于不同产品结构中的一组产品。如华为厂家生产的华为手机、华为手环,华为手机属于手机产品结构中,华为手环则属于手环产品结构中中。

具体代码实例

代码语言:javascript
复制
<?php

interface Phone
{
    public function open();

    public function operate();
}

class HuaweiPhone implements Phone
{
    public function open()
    {
        echo "打开华为手机";
    }

    public function operate()
    {
        echo "操作华为手机";
    }
}

interface Bracelet
{
    public function look();

    public function click();
}

class XiaomiBracelet implements Bracelet
{
    public function look()
    {
        echo "查看小米手环";
    }

    public function click()
    {
        echo "点击小米手环";
    }
}

abstract class Factory
{
    abstract public static function createPhone();

    abstract public static function createBracelet();
}

class ProductFactory extends Factory{
    public static function createPhone()
    {
        return new HuaweiPhone();
    }

    public static function createBracelet()
    {
        return new XiaomiBracelet();
    }
}

$newPhone = ProductFactory::createPhone();
$newPhone->open();
$newPhone->operate();

$newBracelet = ProductFactory::createBracelet();
$newBracelet->look();
$newBracelet->click();

以上就是我对工厂模式的一些学习见解,希望对部分同行人在理解上有一定的帮助,感谢你们的关注!

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/164356.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档