「PHP」简单工厂模式
所属:创建型模式,常用设计模式之一
工厂模式分为:简单工厂模式、工厂方法模式、静态工厂模式、抽象工厂模式。
下面为简单工厂模式。
参考资料:
-
- 《大话设计模式》程杰
简单工厂模式是由一个工厂类决定创建出哪一种产品类的实例
其中有两个关键字,工厂类、产品类。
下面举个例子解释这两个关键词。
程序代码中应用缓存,暂时考虑用Memcached,之后可能会换Redis,程序如何设计。
解决的问题:
假设程序设计使用Memcached,每一次的代码肯定是 new Memcaced ; 如果因为项目扩展要更换为Redis,必然很多代码都要改。
流程图如下:
产品类:其中Memcached和Redis是产品类,暂时举例两个产品类,可能会有很多个。
工厂类:声明一个公共类,由该类指定使用哪个产品,这样就不需要改动【调用层】代码内容。
看到这个图是不是对关键词清晰很多了。
我们要做什么:
让工厂类【公共类】来选择调用哪个具体产品
入口文件:index.php
<?php // 自动加载 spl_autoload_register(function ($class) { $file = __DIR__ . '/' . $class . '.php'; require_once($file); }); $mode = Cache::cacheMode('Redis'); // 调用工厂类(缓存公共类) $mode->getName();
公共缓存文件 Cache.php
<?php namespace factory; /** * 缓存公共方法 **/ class Cache { public static function cacheMode($type) { switch ($type) { case 'Redis': return new RedisMode(); break; case 'Memca'; return new MemcachedMode(); break; default: return false; break; } } }
Redis类:RedisMode.php
<?php class RedisMode { public function getName() { echo '我是Redis'; } }
Memcached类:MemcachedMode.php
<?php class MemcachedMode { public function getName() { echo '我是Memcached'; } }
GitHub源码地址:https://github.com/xiaobaoword/design_pattern/tree/master
优点:
1. 一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
1. 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
2. 违背了设计模式的原则【开放封闭】原则
开放封闭:一个类,应该是可扩展的,而不可修改的。
之后,工厂方法模式应运而生,请看下章。