php设计模式-工厂模式

文章介绍了工厂模式的概念,包括需要知道类名的传统工厂模式和匿名工厂模式的实现方式,以及其实例化对象的过程。同时阐述了工厂模式在大型项目中的应用,优点如方便维护和扩展性,以及缺点如增加开发量。此外,还提到了适用场景和优缺点。
摘要由CSDN通过智能技术生成

 1.  第一种模式必须知道类名

/**
 * 女人类
 */
class woman{
    public function display(){
        echo '我是女人';
    }
}

/**
 * 男人类
 */
class man{
    public function display(){
        echo '我是男人';
    }
}

/**
 * 人妖类
 */
class person{
    public function display(){
        echo '我是人妖';
    }
}


/**
 *  工厂模式
 */
class Factory
{
    public static function createObj($className)
    {
        if ($className) {
            return new $className();
        } else {
            return null;
        }
    }
}
$ceshi = Factory::createObj('woman'); //实例化女人
$ceshi->display(); // 输出:我是女人

$ceshi = Factory::createObj('man'); //实例化男人
$ceshi->display(); // 输出:我是男人

$ceshi = Factory::createObj('person'); //实例化人妖
$ceshi->display(); // 输出:我是人妖

2. 匿名工厂  不需要知道类名

/**
 * 女人类
 */
class woman{
    public function display(){
        echo '我是女人';
    }
}

/**
 * 男人类
 */
class man{
    public function display(){
        echo '我是男人';
    }
}

/**
 * 人妖类
 */
class person{
    public function display(){
        echo '我是人妖';
    }
}

/**
 *  匿名工厂模式
 */
class anonyFactory{
    public static function createObj($flag){
            switch ($flag){
                case 'm':
                    return new woman();
                case 'w':
                    return new man();
                case 'p':
                    return new person();
                default:
                    return null;
            }
    }
}

$ceshi = anonyFactory::createObj('m'); //实例化女人
$ceshi->display(); // 输出:我是女人

$ceshi = anonyFactory::createObj('w'); //实例化男人
$ceshi->display(); // 输出:我是男人

$ceshi = anonyFactory::createObj('p'); //实例化人妖
$ceshi->display(); // 输出:我是人妖

1.  工厂模式是一种按需生产对象的模式

2. 工厂模式通常 是需要在大型项目中,会出现很多的相同的类,此时可以使用工厂产生对象。

3. 工厂模式的优点就是能够方便的维护

4. 工厂模式的缺点是随着功能的增加了,会需要增加很多开发量(多个工厂)


// product类
class ProductA{
    public function __construct(){
        echo 'ProductA';
    }
}
// productB类
class ProductB{
    public function __construct(){
        echo 'ProductB';
    }
}

// 抽象产品类
class Factory{
    public static function createProduct($type){
        switch($type){
            case 'A':
                return new ProductA();
            case 'B':
                return new ProductB();
        }
    } 
}

// 测试
$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
// var_dump($productA);
// var_dump($productB);

 *  工厂模式

 * 1. 一个类无法预期要创建的对象类

 * 2. 一个类使用其子类创建对象

 * 3. 一个类希望由子类来指定创建对象

 *

 * 优点:

 * 1. 一个调用者想创建一个对象,只要知道其名称就可以了

 * 2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以

 * 3. 屏蔽产品的具体实现,调用者只关心产品的接口

 *

 * 缺点:

 * 1. 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加

 * 2. 增加了系统的抽象性和理解难度

 *

 * 适用场景:

 * 1. 客户端不知道它所需要的对象的类

 * 2. 抽象工厂类通过其子类来指定创建哪个对象

 * 3. 创建对象的任务由多个具体子工厂类中的某一个完成,而抽象工厂仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_最初の心

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

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

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

打赏作者

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

抵扣说明:

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

余额充值