工厂模式

工厂模式

工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
应用场景:主要解决接口选择的问题,我们明确地计划不同条件下创建不同实例时;解决简单工厂模式的缺点,之所以可以解决简单工厂的问题,是因为工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式在添加新产品的时候就不修改工厂类逻辑而是添加新的工厂子类,符合开放封闭原则,克服了简单工厂模式中缺点
优点:更符合开-闭原则;符合单一职责原则;不使用静态工厂方法,可以形成基于继承的等级结构
缺点:添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销;一个具体工厂只能创建一种具体产品
注意:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度

//抽象工厂
interface LoggerFactory
{
    public function createLogger();
}
//抽象产品
interface Logger
{
    public function log($message);
}
//具体工厂类
class StdoutLoggerFactory implements LoggerFactory
{
    public function createLogger()
    {
        return new StdoutLogger();
    }
}
class FileLoggerFactory implements LoggerFactory
{
    private $filePath;
    public function __construct(string $filePath)
    {
        $this->filePath = $filePath;
    }
    public function createLogger()
    {
        return new FileLogger($this->filePath);
    }
}
//具体产品类
class StdoutLogger implements Logger
{
    public function log($message)
    {
        echo $message;
    }
}
class FileLogger implements Logger
{
    private $filePath;
    public function __construct($filePath)
    {
        $this->filePath = $filePath;
    }
    public function log($message)
    {
        file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值