02
02月
2020
简单工厂模式
模式定义
简单工厂的作用是由一个工厂对象决定创建出哪一种产品类的实例,而不需要客户了解这个对象属于哪个具体的子类。简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂。
简单工厂模式的优势
让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。
简单工厂模式的缺陷
当产品修改时,工厂类也要做相应的修改,违反了开-闭原则(对于扩展代码开放,对于类内修改关闭)。
代码实现
SimpleFactory\IShapre.class.php
<?php namespace SimpleFactory; /* * 接口,限定子类实现方法 */ interface IShape { public function draw(); }
SimpleFactory\Circle.class.php
<?php namespace SimpleFactory; /* * 实现类 * 画圆 */ class Circle implements IShape { public function draw() { return "画一个圆形"; } }
SimpleFactory\Square.class.php
<?php namespace SimpleFactory; /* * 实现类 * 画方 */ class Square implements IShape { public function draw() { return "画一个正方形"; } }
SimpleFactory\ShapeFactory.class.php
<?php namespace SimpleFactory; /* * 简单工厂类 */ class ShapeFactory { const CIRCLE = 'circle'; const SQUARE = 'square'; private $shape; public function __construct($shape) { $this->shape = $shape; } /* * 根据初始化传参,实例化不同的实现类 */ public function getShape() { switch ($this->shape){ case self::CIRCLE: return new Circle(); break; case self::SQUARE: return new Square(); break; default: return null; } } }
SimpleFactory\SimpleFactoryTest.php
<?php /* * 用于测试简单工厂模式 */ spl_autoload_register(function ($className){ $className = str_replace('\\','/',$className); include $className . ".class.php"; }); use SimpleFactory\ShapeFactory; $shapeFactory = new ShapeFactory(ShapeFactory::SQUARE); $shape = $shapeFactory->getShape(); $result = $shape->draw(); echo $result;
测试
php SimpleFactory/SimpleFactoryTest.php 输出:画一个正方形
总结
采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性;缺点是可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,不符合OCP(开闭原则)的原则。简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。
代码地址:https://github.com/798256478/design-patterns/tree/master/SimpleFactory