设计模式学习(四)、工厂方法模式

1工厂方法模式的概念:

定义了一个创建对象的接口,但是由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。(这里所谓的决定,并不是指模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需要知道实际创建的产品是哪一个。选择使用哪个子类,就决定了实际创建的产品是什么)

2.工厂方法模式的结构图

3.工厂方法模式角色说明

抽象创建者(creator)角色:creator是一个抽象类,实现了所有的操作产品的方法,但是不实现工厂方法。
具体创建者(ConcreteCreator)角色:ConcreteCreate实现FactoryMethod()方式,以创造出实际的产品。
抽象产品(product)角色:所有的产品都必须实现这个共同结构,这样一来,使用这些产品就可以引用这个接口而不是具体的类。。
具体产品(ConcreteProduct)角色:具体产品类,实现抽象产品接口。

4.工厂方法模式的实现

<?php
/**
 * 工厂方式模式实例
 */
//抽象工厂类
public abstract Class Creator
{
    public function operation($type){
        $product = $this->factory($type);
        $product->operation1();
        $product->operation2();
        $product->operation3();

    }
    public function operation1(){
        echo 'operation 1';
    }
    public function operation2(){
        echo 'operation 2';
    }
    public function operation3(){
        echo 'operation 3';
    }
    public abstract  function factory($type);
}

//具体工厂类
class ConcreteCreator extends  Creator
{
    public function factory($type){
        if($type == 'apple')
            return new ConcreteProduct1();
        else if($type == 'orange')
            return new ConcreteProduct2();
        else
            return null;
    }
}

//抽象产品
interface Product
{
    public function description();
}
//具体产品

class ConcreteProduct1 implements  Product
{
    public function description(){
        echo 'this is ConcreteProduct1';
    }
}
//具体产品

class ConcreteProduct2 implements  Product
{
    public function description(){
        echo 'this is ConcreteProduct2';
    }
}

//客户端使用
$c = new ConcreteCreator();
$c->operation('apple');
$c->operation('orange');

 
原文地址:https://www.cnblogs.com/huixuexidezhu/p/5972600.html