php设计模式-简单工厂模式 (Simple Factory)

简介: 简单工厂模式又称为静态工厂方法模型,它属于类创建型模式,简单工厂并不属于23种设计模式,刚开始学习设计模式的同学,对简单工厂模式、工厂方法、抽象工厂中的工厂一知半解,其实白话点来说:这些模式一定会有一个工厂类,子类并不需要知道工厂细节,只需新建工厂创建产品即好。

简单工厂模式

简单工厂模式又称为静态工厂方法模型,它属于类创建型模式,简单工厂并不属于23种设计模式,刚开始学习设计模式的同学,对简单工厂模式、工厂方法、抽象工厂中的工厂一知半解,其实白话点来说:这些模式一定会有一个工厂类,子类并不需要知道工厂细节,只需新建工厂创建产品即好。

问题

假设你正在开发一款组装DIY台式电脑的应用,最初版本只需要拼装一台台式电脑并计算出每台总部件价格即可,因此大部分代码都在DIY台式电脑的类中。

// DiyComputer.php
// 鼠标
$mouse = new Mouse();
$mousePrice = $mouse->getPrice();
// 键盘
$keyboard = new Keyboard();
$keyboardPrice = $keyboard->getPrice();
// 显示器
$display = new Display();
$displayPrice = $display->getPrice();
....
// 计算组装所有部件价格
echo $mousePrice + $keyboardPrice + $displayPrice + ...;


过了一段时间,使用DIY台式电脑的用户都觉得普通有线键盘不好用,需要换成无线键盘,这时你可能需要对每个DIY台式电脑的类修改键盘类代码。

// DiyComputer.php
// 鼠标
$mouse = new Mouse();
$mousePrice = $mouse->getPrice();
// 键盘
// $keyboard = new Keyboard();
$keyboard = new WirelessKeyboard();
$keyboardPrice = $keyboard->getPrice();
// 显示器
$display = new Display();
$displayPrice = $display->getPrice();
....
// 计算组装所有部件价格
echo $mousePrice + $keyboardPrice + $displayPrice + ...;


更糟糕的是,如果以后这些DIY台式电脑的用户需要换其它部件,很有可能需要再次对这些代码进行大幅度修改。

解决方案

简单工厂方法模式解决频繁更换各个部件,无法预知对象确切类别及其依赖关系时,可以用简单工厂方法。

白话文:需求频繁变动,没有切确的功能,避免代码多次重复改,可以采用此方法。

STEP 1 建立产品类

建立一个产品基类。如 Product 产品基类。然后,确保所有部件实现产品基接口。例如,鼠标实现 产品 接口;所有部件都实现 键盘 接口,以此类推。

STEP 2 建立工厂

建立一个组装工厂,其中有 production 生产产品类方法,production 方法通过传入的值, Switch 选择创建对象。客户端知道工厂提供 所有的部件创建方法,但是并不关心其具体实现方式

结构

1个工厂

1个 interface 或者 abstract 产品基类

多个实现 interface 或者继承 abstract 的具体产品

代码示例

DIY台式电脑部件工厂类

//Factory.php
class Factory
{
    /**
     * 生产工厂
     * @param string $product
     * @return Product
     */
    static public function production(string $product): Product
    {
        switch ($product) {
            case 'mouse':
                $result = new Mouse();
                break;
            case 'keyboard':
                $result = new Keyboard();
                break;
            case 'display':
                $result = new Display();
                break;
            default:
                throw new \InvalidArgumentException('没有此部件');
        }
        return $result;
    }
}


部件产品接口基类

// Product.php
interface Product
{
    public function getPrice();
}


具体部件产品类

// Mouse.php
class Mouse implements Product
{
    public function getPrice(): float
    {
        return 499.99;
    }
}
// Keyboard.php
class Keyboard implements Product
{
    public function getPrice(): float
    {
        return 149.99;
    }
}
//Display.php
class Display implements Product
{
    public function getPrice(): float
    {
        return 1499.99;
    }
}


组装的DIY台式电脑类

DiyComputer.php
// 生成鼠标
$mouse = Factory::production('mouse');
$mousePrice = $mouse->getPrice();
// 生成键盘
$keyboard = Factory::production('keyboard');
$keyboardPrice = $keyboard->getPrice();
// 生成显示器
$display = Factory::production('display');
$displayPrice = $display->getPrice();
....
// 计算组装所有部件价格
echo $mousePrice + $keyboardPrice + $displayPrice + ...;


优缺点

优点

  • 可以避免具体产品和创建者之间紧密耦合。

缺点

  • 工厂需要引入很多新的子类,代码可能会因此变得更复杂。
  • 违背了开闭原则,添加新的部件必须去工厂类中修改循环语句
目录
相关文章
|
20天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
2月前
|
设计模式 安全 Java
Kotlin - 改良设计模式 - 构建者模式
Kotlin - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 缓存 数据库连接
深入理解PHP的面向对象编程与设计模式####
本文旨在通过实例解析PHP中面向对象编程的核心概念及其在实际开发中的应用,特别是单例模式、工厂模式和观察者模式等常见设计模式。文章将展示这些模式如何帮助开发者构建更加灵活、可维护的代码结构,以及它们在解决具体问题时的优势。 ####
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
51 1
|
2月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
29 1
|
3月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第12天】 在软件开发的世界中,设计模式是解决常见问题的最佳实践。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理运用设计模式可以极大地提高代码的可维护性、扩展性和复用性。本文将深入探讨策略模式(Strategy Pattern)的原理、实现方式及其在PHP中的应用。通过具体示例,我们将展示如何利用策略模式来解耦算法与对象,从而让代码更加灵活和易于管理。
32 0
|
3月前
|
设计模式 存储 安全
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和重用性的关键技术之一。本文将深入探讨单例模式(Singleton Pattern)的原理、实现方式及其在PHP中的应用,同时通过实例展示如何在具体的项目场景中有效利用单例模式来管理和组织对象,确保全局唯一性的实现和最佳实践。