适用条件:
简单的说,所有的设计模式的目标都是为了以后的扩展. 当业务扩展时,尽可能少的修改原有代码. 我们知道,修改原有代码就有可能出错,会担责任的.
本模式适用于只有一种产品,但本产品可以有多种型号(版本),而且以后可能还会增加新的型号. 我们在应用中需要根据实际的情况来创建不同版本的产品对象.
限制条件:
1.产品: 只有一种产品, 但可以有多个型号,并且以后还会增加
2.产品: 产品的创建过程较复杂.
3.工厂: 只有一个工厂, 可以根据参数的不同来创建不同的产品.
4.工厂: 产品只由工厂创建, 开发人员不要自行创建产品.
5.业务限制: 业务增长后,可能会增加产品型号, 此时需要修改工厂方法来提供新型号产品的创建过程
注意:
看完具体实现后, 一定要看最后的示例.
具体实现:
/** * 简单工厂示例 * User: 蓝冰大侠 */ class CSimpleFactory extends SController { public function index() { //生成工厂 $factory = new Factory(); //使用工厂创建产品X $product = $factory->createProduct('x'); $product->methodA(); $product->methodB(); //使用工厂创建产品Y $product = $factory->createProduct('y'); $product->methodA(); $product->methodB(); } } //所有产品的基类 abstract class Product { //每个产品都必须实现以下方法 abstract public function methodA(); abstract public function methodB(); } //定义产品类X class ProductX extends Product { public function methodA() { echo 'product x do A.'; } public function methodB() { echo 'product X do B.'; } } //定义 产品类Y class ProductY extends Product { public function methodA() { echo 'product Y do A'; } public function methodB() { echo 'product Y do B'; } } //定义工厂类 class Factory { //根据参数的不同创建不同的产品 public function createProduct($type): Product { if ($type == 'x') { return new ProductX(); } if ($type == 'y') { return new ProductY(); } throw new Exception('Unknown product type.'); } }示例:
关于缓存的使用是一个普遍问题,我们可以使用本地文件进行缓存,也可以使用数据库进行缓存,还可以使用memcache,redis,mongo
系统中需要缓存的数据也有多种: 查询结果缓存/页面缓存/跨页面消息缓存.
我们可能根据业务 情况 在不同的功能中,使用不同的缓存载体.
即: 缓存工厂要根据参数来创建不同载体的具体缓存类~~~.
示例二:
支付类, 系统中可能实现 支付宝,微信支付等,但业务接口肯定是一样的, 我们的业务代码要根据用户的实际选择来创建具体的支付类.
这里我们就应该用工厂来生成这个具体的支付对象. 业务代码就不需要关注支付对象的生成细节了