PHP设计模式笔记:工厂方法(Factory Method)
前言:
话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪),还雇了司机为他开车。 不过,爆发户坐车时总是这样:上Benz车后跟司机说”开奔驰车!”,坐上Bmw后他说”开宝马车!”,坐上Audi后他说”开奥迪车!”。 你一定说:这人有病!直接说开车不就行了?! 而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的! 幸运的是,这种有病的现象在OO语言中可以避免了。
工厂方法模式:
定义一个用于创建对象的接口,由其子类决定实例化哪一个类。
要点:
- 完全符合开闭原则,增加新产品时,不用修改任何代码,只需要扩展新产品类
结构图:
角色:
- 抽象工厂角色:具体工厂角色必须实现的接口或者必须继承的父类。
- 具体工厂角色:创建对应的具体产品的对象。
- 抽象产品角色:具体产品继承的父类或者是实现的接口。
- 具体产品角色:具体工厂角色所创建的对象。
应用场景:
- 在编码时不能预见需要创建哪种类的实例。
- 系统不应依赖于产品类实例如何被创建、组合和表达的细节
优点:
- 工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
缺点:
- 有时候要多写代码
<?php
/**
* 工厂模式
* @author 胖子 phppan
* @package design pattern
*/
/**
* 抽象工厂角色
*/
interface Creator {
public function factoryMethod();
}
/**
* 具体工厂角色A
*/
class ConcreteCreatorA implements Creator {
/**
* 工厂方法 返回具体 产品A
* @return ConcreteProductA
*/
public function factoryMethod() {
return new ConcreteProductA();
}
}
/**
* 具体工厂角色B
*/
class ConcreteCreatorB implements Creator {
/**
* 工厂方法 返回具体 产品B
* @return ConcreteProductB
*/
public function factoryMethod() {
return new ConcreteProductB();
}
}
/**
* 抽象产品角色
*/
interface Product {
public function operation();
}
/**
* 具体产品角色A
*/
class ConcreteProductA implements Product {
/**
* 接口方法实现 输出特定字符串
*/
public function operation() {
echo 'ConcreteProductA <br />';
}
}
/**
* 具体产品角色B
*/
class ConcreteProductB implements Product {
/**
* 接口方法实现 输出特定字符串
*/
public function operation() {
echo 'ConcreteProductB <br />';
}
}
class Client {
/**
* Main program.
*/
public static function main() {
$creatorA = new ConcreteCreatorA();
$productA = $creatorA->factoryMethod();
$productA->operation();
$creatorB = new ConcreteCreatorB();
$productB = $creatorB->factoryMethod();
$productB->operation();
}
}
Client::main();
?>