PHP设计模式-工厂方法模式

定义

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类

工厂方法模式通过让子类(NYPizzaStore, ChicagoPizzaStore)决定该创建的对象(NYStyleCheesePizza,ChicagoCheesePizza),来达到将对象创建的过程封装的目的。

类图

工厂模式定义

实例图

Creator Class

Product Class

实例

创建者

//创建者超类
abstruct class PizzaStore
{
    public function orderPizza($type)
    {
        $pizza = $this->createPizza($type);

        $pizza->prepare();
        $pizza->bake();
        $pizza->cut();
        $pizza->box();

        return $pizza;
    }

    abstract public function createPizza($type);
}

//参数化工厂方法
//具体创建者
class NYPizzaStore extends PizzaStore
{
    public function createPizza($type)
    {
        if($type == 'cheese') {
            $pizza = new NYStyleCheesePizza();
        }elseif($type == 'peppernoi') {
            $pizza = new NYStylePeppernoiPizza();
        }elseif($type == 'clam') {
            $pizza = new NYStyleClamPizza();
        }

        return $pizza;
    }
}

//具体创建者
class ChicagoPizzaStore extends PizzaStore
{
    public function createPizza($type)
    {
        if($type == 'cheese') {
            $pizza = new ChicagoStyleCheesePizza();
        }elseif($type == 'peppernoi') {
            $pizza = new ChicagoStylePeppernoiPizza();
        }elseif($type == 'clam') {
            $pizza = new ChicagoStyleClamPizza();
        }

        return $pizza;
    }
}

产品类

//产品超类
abstract class Pizza
{
    private $name;
    private $dough;
    private $sauce;
    private toppings = [];

    private function prepare()
    {
        echo "Preparing ".$this->name;
        echo "Tossing";
        ...
    }
    
    private function bake()
    {
        echo "bake";
    }

    private function cut()
    {
        echo "cut";
    }

    private function box()
    {
        echo "box";
    }

    public function getName()
    {
        return $this->name;
    }
}

//具体产品
class NYStyleCheesePizza extends Pizza
{
    public function __construct()
    {
        $this->name = "NY Style Souce and Cheese Pizza";
        $this->dough = "NY dough";
        $this->sauce = "NY sauce";
        $this->toppings[] = "Cheese";
    }

    //也可以重写父类的方法 实现子类特有的制作工艺
}

测试


$nyStore = new NYPizzaStore();
$pizza = $nyStore->orderPizza("cheese");
echo $pizza->getName();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 场景问题# 1.1 导出数据的应用框架## 考虑这样一个实际应用:实现一个导出数据的应用框架,来让客户选择数据...
    七寸知架构阅读 11,792评论 6 75
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,178评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,578评论 18 399
  • 简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建...
    justCode_阅读 4,968评论 1 9
  • 海纳百川,多么气势磅礴的四个字,每次看到这几个字都有种热血沸腾的感觉。 最近发生了很多事,新的工作环境使自己很不...
    姜杨Ada阅读 3,989评论 4 0

友情链接更多精彩内容