23种设计模式-工厂模式
概述
工厂模式属于创建型模式,它定义一个用于创建对象的接口,让子类决定实例化哪个产品类的对象。工厂方法使一个产品类的实例化延迟到其工厂的子类
结构
工厂模式的主要角色:
- 抽象工厂
AbstractFactory
:提供了创建产品的接口,调用者通过它访问具体的工厂方法来创建产品 - 具体工厂
ConcreteFactory
:主要是实现抽象工厂中的抽象方法,完成具体产品的创建 - 抽象产品
Product
:定义了产品的规范,描述了产品的主要特性和功能 - 具体产品
ConcreteProduct
:实现了抽象产品角色定义的接口,由具体工厂来创建,它同具体工厂之间一一对应
代码实现
/**
* 手机厂商接口
* 抽象工厂
*/
interface MobileFactory
{
// 生产产品接口
public function produce();
}
/**
* 手机产品接口
* 抽象产品
*/
interface Mobile
{
public function getName();
}
/**
* 红米K70
* 具体产品
*/
class RedmiK70 implements Mobile
{
public function getName()
{
return '红米K70';
}
}
/**
* 华为Nova12
* 具体产品
*/
class HuaweiNova12 implements Mobile
{
public function getName()
{
return '华为Nova12';
}
}
/**
* 华为手机厂商
* 具体工厂
*/
class Huawei implements MobileFactory
{
public function produce()
{
return new HuaweiNova12();
}
}
/**
* 红米手机厂商
* 具体工厂
*/
class Redmi implements MobileFactory
{
public function produce()
{
return new RedmiK70();
}
}
/**
* 测试工厂
*/
class Shop
{
public function __construct(private MobileFactory $factory)
{
}
public function orderMobile()
{
$mobile = $this->factory->produce();
echo $mobile->getName();
}
}
// 实际调用
$shop = new Shop(new Huawei());
$shop->orderMobile();