PHP设计模式之——工厂模式

简介: 在开发大型系统过程中,往往会出现这样一种情况: 我有一部分基础数据,是类classA是从数据库A读取出来的,其他很多的功能都是基于这个基础数据来操作的。现在呢,我想把数据从数据库A变成从另外的数据源去获取,这时候,要修改起来就比较麻烦,要修改其他很多类的代码。这种设计显然是不够灵活的,换句话说,就是紧耦合的,系统中某个部分的函数或类严重依赖于系统的其他部分中的函数或类的行为和结构。 工

在开发大型系统过程中,往往会出现这样一种情况:

我有一部分基础数据,是类classA是从数据库A读取出来的,其他很多的功能都是基于这个基础数据来操作的。现在呢,我想把数据从数据库A变成从另外的数据源去获取,这时候,要修改起来就比较麻烦,要修改其他很多类的代码。这种设计显然是不够灵活的,换句话说,就是紧耦合的,系统中某个部分的函数或类严重依赖于系统的其他部分中的函数或类的行为和结构。

工厂模式,就是解决这样的一些情况的设计方法。工厂模式是一种类,建立了一个工厂来根据所需来创建对象,这种方式在多态性编程中是很重要的,允许动态替换类,修改配置等。

工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式。

简单工厂模式,通过静态方法创建对象。可以理解成,只负责生产同一等级结构中的任何一个产品,但是不能新增产品。

工厂方法模式,去掉了简单工厂模式中方法的静态属性,使其可以被子类集成,定义一个创建对象的接口,让子类去决定实例化哪个类。可以理解成,用来生产同一等级结构中的固定产品,但是支持增加产品。

抽象工厂模式,提供一个创建一系列相关或者相互依赖的对象的接口。可以理解成,用来生产不用类型的全部产品,但是不能增加新品,支持增加新的类型。

用代码来一一举例:


<?php
/**
 * 基本工厂模式
 * */
class User { 
    private $username; 
    public function __construct($username) { 
        $this->username = $username; 
    } 
    
    public function getUser() { 
        return $this->username; 
    } 
}

class userFactory { 
    static public function createUser() { 
        return new User('Jack'); 
    } 
}

$user = userFactory::createUser();echo $user->getUser();

/**
 *简单工厂模式
 * */
interface userProperties {
    function getUsername();
    function getGender();
    function getJob();
}
class User implements userProperties{
    private $username;
    private $gender;
    private $job;
    public function __construct($username, $gender, $job) {
        $this->username = $username;
        $this->gender = $gender;
        $this->job = $job;
    }

    public function getUsername() {
        return $this->username;
    }

    public function getGender() {
        return $this->gender;
    }

    public function getJob() {
        return $this->job;
    }
}

class userFactory {
    static public function createUser($properties = []) {
        return new User($properties['username'], $properties['gender'], $properties['job']);
    }
}

$employers = [
    ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
    ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
    ];
$user = userFactory::createUser($employers[0]);
echo $user->getUsername();

/**
 * 工厂方法模式
 **/
interface userProperties {
    function getUsername();
    function getGender();
    function getJob();
}

interface createUser {
    function create($properties);
}

class User implements userProperties{
    private $username;
    private $gender;
    private $job;
    public function __construct($username, $gender, $job) {
        $this->username = $username;
        $this->gender = $gender;
        $this->job = $job;
    }

    public function getUsername() {
        return $this->username;
    }

    public function getGender() {
        return $this->gender;
    }

    public function getJob() {
        return $this->job;
    }
}

class userFactory {
    private $user;
    public function __construct($properties = []) {
        $this->user =  new User($properties['username'], $properties['gender'], $properties['job']);
    }

    public function getUser() {
        return $this->user;
    }
}

class FactoryMan implements createUser {
    function create($properties) {
        return new userFactory($properties); 
    }
} 

class FactoryWoman implements createUser {
    function create($properties) {
        return new userFactory($properties);
    }
}

class clientUser {
    static public function getClient($properties) {
        $fac = new FactoryMan;
        $man = $fac->create($properties);
        echo $man->getUser()->getUsername();
    }
}

$employers = [
    ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
    ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
    ];
$user = clientUser::getClient($employers[0]);

/**
 * 抽象工厂模式
 * */

interface userProperties {
    function getUsername();
    function getGender();
    function getJob();
}

interface createUser { //将对象的创建抽象成一个接口
    function createOpen($properties);//内向创建
    function createIntro($properties);//外向创建
}

class User implements userProperties{
    private $username;
    private $gender;
    private $job;
    public function __construct($username, $gender, $job) {
        $this->username = $username;
        $this->gender = $gender;
        $this->job = $job;
    }

    public function getUsername() {
        return $this->username;
    }

    public function getGender() {
        return $this->gender;
    }

    public function getJob() {
        return $this->job;
    }
}

class userFactory {
    private $user;
    public function __construct($properties = []) {
        $this->user =  new User($properties['username'], $properties['gender'], $properties['job']);
    }

    public function getUser() {
        return $this->user;
    }
}

class FactoryMan implements createUser {
    function createOpen($properties) {
        return new userFactory($properties); 
    }

    function createIntro($properties) {
        return new userFactory($properties); 
    }
} 

class FactoryWoman implements createUser {
    function createOpen($properties) {
        return new userFactory($properties);
    }

    function createIntro($properties) {
        return new userFactory($properties);
    }
}

class clientUser {
    static public function getClient($properties) {
        $fac = new FactoryMan;
        $man = $fac->createOpen($properties);
        echo $man->getUser()->getUsername();
    }
}

$employers = [
    ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
    ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
    ];
$user = clientUser::getClient($employers[0]);




相关文章
|
2月前
|
设计模式 PHP
PHP中的设计模式:单一职责原则在软件开发中的应用
【10月更文挑战第8天】 在软件开发中,设计模式是解决常见问题的经验总结,而单一职责原则作为面向对象设计的基本原则之一,强调一个类应该只有一个引起变化的原因。本文将探讨单一职责原则在PHP中的应用,通过实际代码示例展示如何运用该原则来提高代码的可维护性和可扩展性。
34 1
|
1月前
|
设计模式 缓存 数据库连接
深入理解PHP的面向对象编程与设计模式####
本文旨在通过实例解析PHP中面向对象编程的核心概念及其在实际开发中的应用,特别是单例模式、工厂模式和观察者模式等常见设计模式。文章将展示这些模式如何帮助开发者构建更加灵活、可维护的代码结构,以及它们在解决具体问题时的优势。 ####
|
1月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
20 1
|
2月前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
2月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将通过探讨单例模式,一种最常用的设计模式,来揭示其在PHP中的应用及优势。单例模式确保一个类仅有一个实例,并提供一个全局访问点。通过实际案例,我们将展示如何在PHP项目中有效实现单例模式,以及如何利用这一模式优化资源配置和管理。无论是PHP初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和技巧,进而提升自己的编程实践。
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
38 1
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
38 2
|
2月前
|
设计模式 缓存 数据库连接
探索PHP中的设计模式:单例模式的实现与应用
在PHP开发中,设计模式是提高代码可复用性、可维护性和扩展性的重要工具。本文将深入探讨单例模式(Singleton Pattern)的基本概念、在PHP中的实现方式以及实际应用场景。单例模式确保一个类仅有一个实例,并提供全局访问点。通过具体代码示例和详细解释,我们将展示如何在PHP项目中有效利用单例模式来解决实际问题,提升开发效率和应用性能。
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
在PHP开发中,设计模式是提高代码可读性、可维护性和扩展性的重要工具。本文将深入探讨策略模式这一行为型设计模式,通过分析其定义、结构、使用场景以及在PHP中的实际应用,帮助开发者更好地理解和运用策略模式来优化自己的项目。不同于传统摘要的简洁概述,本文摘要部分将详细阐述策略模式的核心理念和在PHP中的实现方法,为读者提供清晰的指引。