在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类(接口)。
具有产品接口、产品实现、工厂实现。没有工厂接口。
简单工厂模式用于生产静态或独立的产品。
优点
将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易
在调用工厂类的工厂方法时,使用起来方便,如果工厂方法是静态方法,可通过类名直接调用。或者只需要传入简单的参数即可。在实际开发中,还可以在调用时将所传入的参数保存在配置文件中,修改参数时无须修改任何源代码
缺点
工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,或者增加一个静态方法,或者增加一个参数,这一点与开闭原则是相违背的。
适用
工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
应用
JDK 加密算法
MessageDigest md = MessageDigest.getInstance(“MD5”);
PHP 示例
零件工厂 PartFactory 负责返回具体零件产品(发动机Engine、车轮Wheel)的实例。
零件有个统一的接口,和一个统一的方法 produce()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| <?php
interface Part { public function produce(); }
class Engine implements Part { public function produce() { echo '生产发动机'; echo PHP_EOL; } }
class Wheel implements Part { public function produce() { echo '生产车轮'; echo PHP_EOL; } }
class PartFactory { public function part($class) { switch($class){ case 'Wheel': return new Wheel(); case 'Engine': return new Engine(); } } }
abstract class PartStaticFactory { public static function Wheel() { return new Wheel(); }
public static function Engine() { return new Engine(); } }
$buttonFactory = new PartFactory(); $buttonFactory->part('Wheel')->produce(); $buttonFactory->part('Engine')->produce();
PartStaticFactory::Wheel()->produce(); PartStaticFactory::Engine()->produce();
|