序言
每一种模式都有它的定义,它的使用场景。我们从实际当中进行学习并且在相应额场景可以运用。所谓的设计模式只是一种思想,并不存在是有固定的代码。学会了思想并且对应上使用的场景,慢慢而言在开发之中这也就慢慢成为你的一部分。
今天我们来讲的是工厂模式,工厂模式一共分3三种。简单工厂模式,工厂方法模式以及抽象工厂模式。
简单工厂模式
在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
用一种很通俗的话来说就是,当一位买家向玩具工厂订货,正好工厂有生产洋娃娃车间,布袋熊车间,汤姆猫车间等等。买家说我需要洋娃娃,而工厂的终端与买家达成协议,并下达命令通知对应的车间进行生产。
具体我们使用php来模拟简单工厂模式,它有那一些构造呢。
如:
Factory类:负责创建具体产品的实例
Product类:抽象产品类,定义产品子类的公共接口
ConcreteProduct 类:具体产品类,实现Product父类的接口功能,也可添加自定义的功能
Factory类,只负责下发对应命令并且拿到相对应的产品。
require_once 'dolly.php';
require_once 'tomcat.php';
require_once 'wombat.php';
/** * Class factory */
class SimpleFactory{
/**
* 通知生产车间
* @param string $name 实际终端下的命令
* @return Dolly|Tomcat|Wombat
* @throws Exception
*/
public static function noticeWorkShop($name){
switch ($name) {
// 洋娃娃
case 'dolly':
return new Dolly();
// 汤姆猫
case 'tom_cat':
return new Tomcat();
// 布袋熊
case 'wombat':
return new Wombat();
default:
throw new Exception('抱歉!我们工厂不生产该种类玩具。');
}
}
}
try {
$product = SimpleFactory::noticeWorkShop('dolly');
echo $product->sound();
} catch (Exception $e) {
echo $e->getMessage();
}
复制代码
product接口类定义产品对应所拥有的行为
interface Product {
/**
* @return mixed
*/
public function sound();
}
复制代码
ConcreteProduct对应的产品行为
require_once 'product.php';
class Dolly implements Product {
/** * Dolly constructor. */
public function __construct() {
}
/** * @return mixed */
public function sound() {
echo '我叫洋娃娃';
}
}
复制代码
总结简单工厂模式:
具体使用场景可以使用在
1. 不需要实例化过多的对象,尽可能保证代码的简单。
2. 不需要关注对象是如何生成的操作。
从简单的工厂模式来看,首先由于只有一个工厂类,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。
工厂方法
工厂方法模式是简单工厂的升级版,在原有的基础上对工厂进行一个抽象的升级,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂。
用一种很通俗的话来说就是,当一位买家向玩具工厂订货,原来在简单工厂里是使用的车间,后来进行了升级变成子工厂,由终端下发到对应的子厂商进行生产。
具体我们使用php来模拟简单工厂模式,它有那一些构造呢。在原有的基础上多了一个工厂的抽象类
如:
Factory类:负责创建具体产品的实例
Product类:抽象产品类,定义产品子类的公共接口
ConcreteProduct 类:具体产品类,实现Product父类的接口功能,也可添加自定义的功能
AbstractFactory类: 抽象工厂类,专门负责子厂商的生成
require_once 'dolly.php';
/** * Class AbstractFactory */
abstract class AbstractFactory {
/** * @return mixed */
abstract public static function create();
}
/** * Class DollyFactory */
class DollyFactory extends AbstractFactory {
/** * @return mixed */
public static function create() {
return new Dolly();
}
}
$dolly = DollyFactory::create();
$dolly->sound();
复制代码
总结工厂方法模式:
具体使用场景可以使用在
1. 通过子类来指定创建对应的对象。
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
抽象工厂方法
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。
通俗而言,工厂将生产电视和生产手机合并成一个工厂,而中间不同产品的类型成为1个工厂对应多个不同的产品。
/** * Interface MiPhone */
interface MiPhone {
/** * @return mixed */
public function display();
/** * @return mixed */
public function use();
}
/** * Class Mi */
class Mi implements MiPhone {
/** * @return mixed */
public function display() {
echo "显示屏幕内容";
}
/** * @return mixed */
public function use() {
echo "正常操作内容";
}
}
/** * Interface Tv */
interface Tv {
/** * @return mixed */
public function open();
/** * @return mixed */
public function use();
}
/** * Class MiTv */
class MiTv implements Tv {
/** * @return mixed */
public function open() {
echo "小米电视";
}
/** * @return mixed */
public function use() {
echo "切换不同的频道";
}
}
abstract class Factory {
/** * @return mixed */
abstract public static function createPhone();
/** * @return mixed */
abstract public static function createTv();
}
/** * Class ProductFactory */
class ProductFactory extends Factory {
public static function createTV() {
return new MiTv();
}
public static function createPhone() {
return new Mi();
}
}
$newTv = ProductFactory::createTV();
$newTv->open();
$newTv->use();
$newPc = ProductFactory::createPhone();
$newPc->open();
$newPc->use();
复制代码
总结抽象工厂方法模式:
具体使用场景可以使用在
1. 不需要知道它所创建的对象的类
2. 需要一组对象共同完成某种功能时。并且可能存在多组对象完成不同功能的情况。
如果您对这些感兴趣,欢迎评论,收藏、转发给予支持!> 欢迎关注我的公众号:猿力说,每日分享学习之路的点点滴滴,以及程序人生.