PHP设计模式之工厂模式详解

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

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

这时,工厂模式的作用性就体现出来了。

工厂模式

就是解决这样的一些情况的设计方法

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

/*基本工厂模式代码*/

rush:PHP;"> username = $username; }

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

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

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

?>

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

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

rush:PHP;"> /*
简单工厂模式

  • */
    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();

?>

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

rush:PHP;"> interface createUser {
function create($properties);
}

class User implements userProperties{
private $username;
private $gender;
private $job;
public function __construct($username,$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['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',];
$user = clientUser::getClient($employers[0]);

?>

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

rush:PHP;"> /**

  • 抽象工厂模式
  • */

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,$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',];
$user = clientUser::getClient($employers[0]);
?>

如有错误,请指正。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用