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');