php与设计模式-工厂模式

工厂模式

创建一个类统一实例化的方法。统一调用,控制。常与单例模式相配合。

简单工厂模式

Demo:

  /**
     *简单工厂又叫静态工厂方法模式,这样理解可以确定,简单工厂模式是通过一个静态方法创建对象的。

// 简单工厂模式
interface ICar {
    function run();
}
class BMWCar implements ICar {
    public function run() {
        echo 'bmw run!<br/>';
    }
}
class AuDiCar implements ICar {
    public function run() {
        echo 'audi run!<br/>';
    }
}
/**
 * 简单工厂
 */
class FactorySimple {
    /*
    public static function createBmw() {
        return new BMWCar();
    }
    public static function createAudi() {
        return new AuDiCar();
    }
    */
    public static function createCar($type) {
        switch($type) {
            case 'bmw':
                return new BMWCar();
            case 'audi':
                return new AuDiCar();
            default:
                throw new Exception('type error!');
        }
    }
}
 

优点:客户端不需要修改代码。
缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

工厂方法模式

和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂
Demo:

/*
 *工厂方法模式:
 *定义一个创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。 */
interface ICar {
    function run();
}
class BMWCar implements ICar {
    public function run() {
        echo 'bmw run!<br/>';
    }
}
class AuDiCar implements ICar {
    public function run() {
        echo 'audi run!<br/>';
    }
}
// 工厂方法模式    与简单工厂的区别,将对象的创建抽象成接口
interface CreateCar { //工厂类接口
    function create();
}
/**
 * bmw car factoyr
 */
class BmwFactory implements CreateCar {
    public function create() {
        return new BMWCar();
    }
}
/**
 * audi car factory
 */
class AuDiFactory implements CreateCar {
    public function create() {
        return new AuDiCar();
    }
}

抽象工厂模式:

用来生成一组相关或相互依赖的对象。
工厂方法模式针对的是一个产品等级结构;
而抽象工厂模式则是针对的多个产品等级结构
Demo:

/*
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口。
注意:这里和工厂方法的区别是:一系列,而工厂方法则是一个。
那么,我们是否就可以想到在接口create里再增加创建“一系列”对象的方法呢?
*/

interface ICar {
    function run();
}
// 抽象工厂模式
class WhiteBMWCar implements ICar {
    public function run() {
        echo 'white bmwcar run!<br/>';
    }
}
class BlackBMWCar implements ICar {
    public function run() {
        echo 'black bmwcar run!<br/>';
    }
}
class WhiteAuDiCar implements ICar {
    public function run() {
        echo 'white audicar run!<br/>';
    }
}
class BlackAuDiCar implements ICar {
    public function run() {
        echo 'black audicar run!<br/>';
    }
}
// 与工厂方法的区别,提供一系列的接口 
interface ICarCreate {
    function createBmw();
    function createAuDi();
}
/**
 * create white car
 */
class WhiteCarFactory implements ICarCreate {
    // white bmw
    public function createBmw() {
        return new WhiteBMWCar();
    }
    // white audi
    public function createAuDi() {
        return new WhiteAuDiCar();
    }
}
/**
 * create black car
 */
class BlackCarFactory implements ICarCreate {
    // black bmw
    public function createBmw() {
        return new BlackBMWCar();
    }
    // black audi
    public function createAuDi() {
        return new BlackAuDiCar();
    }
}

请关注我的订阅号

订阅号.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值