PHP 设计模式之三种工厂模式
简单工厂
通过静态方法传入不同的参数创建不同的对象,实现对象创建和使用的分离
<?php
class mysql_conn {
private $dbh = null;
private $host = 'localhost';
private $port = '3306';
private $user = 'root';
private $password = '****';
private $dbname = 'test'; public function __construct() {
$this->dbh = new PDO('mysql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbname, $this->user, $this->password);
} public function get_table_data($table_name) {
foreach($this->dbh->query("SELECT * from `$table_name`") as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
}
} class psql_conn {
private $dbh = null;
private $host = 'localhost';
private $port = '5432';
private $user = 'postgres';
private $password = '****';
private $dbname = 'test'; public function __construct() {
$this->dbh = new PDO('pgsql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbname, $this->user, $this->password);
} public function get_table_data($table_name) {
foreach($this->dbh->query("SELECT * from `$table_name`") as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
} public function custom_query($sql) {
$stmt = $this->dbh->prepare($sql);
$stmt->execute();
foreach ($stmt as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
}
} class Factory {
public static function pdo_conn($db = 'mysql') {
if ($db == 'mysql') {
return new mysql_conn();
}
else if ($db == 'psql') {
return new psql_conn();
}
}
} // mysql
// $mysql_dbh = Factory::pdo_conn('mysql');
// $mysql_dbh->get_table_data('user');
// $mysql_dbh->get_table_data('order'); // postgresql
// $psql_dbh = Factory::pdo_conn('psql');
// $psql_dbh->custom_query('select * from student');
通过上面的代码可以看出,简单工厂的缺点就是后面如果想增加新的连接,需要频繁地去修改静态方法
工厂方法
通过定义一个抽象的核心工厂类,并定义创建产品对象的接口。
创建具体产品示例的工作延迟到其工厂子类去完成。
当系统需要新增一个产品是,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则;
<?php
interface database_option {
public function custom_query($sql);
public function get_table_data($table_name);
} class mysql_conn implements database_option {
private $dbh = null;
private $host = 'localhost';
private $port = '3306';
private $user = 'root';
private $password = '****';
private $dbname = 'test'; public function __construct() {
$this->dbh = new PDO('mysql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbname, $this->user, $this->password);
} public function get_table_data($table_name) {
foreach($this->dbh->query("SELECT * from `$table_name`") as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
} public function custom_query($sql) {
$stmt = $this->dbh->prepare($sql);
$stmt->execute();
foreach ($stmt as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
}
} class psql_conn implements database_option {
private $dbh = null;
private $host = 'localhost';
private $port = '5432';
private $user = 'postgres';
private $password = '****';
private $dbname = 'test'; public function __construct() {
$this->dbh = new PDO('pgsql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbname, $this->user, $this->password);
} public function get_table_data($table_name) {
foreach($this->dbh->query("SELECT * from `$table_name`") as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
} public function custom_query($sql) {
$stmt = $this->dbh->prepare($sql);
$stmt->execute();
foreach ($stmt as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
}
} abstract class Factory {
abstract static function pdo_conn();
} class mysql_Factory extends Factory {
public static function pdo_conn() {
return new mysql_conn();
}
} class psql_Factory extends Factory {
public static function pdo_conn() {
return new psql_conn();
}
} // mysql
// $mysql_dbh = mysql_Factory::pdo_conn();
// $mysql_dbh->get_table_data('order'); // psql
// $psql_dbh = psql_Factory::pdo_conn();
// $psql_dbh->custom_query('select * from student');
工厂方法是简单工厂的进一步抽象,由于使用了面向对象的多态性,工厂方法保持了简单工厂的优点,在工厂方法中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类。所以可以在不修改工厂方法的情况下引入新的产品,复合开闭原则。
抽象工厂
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。
<?php
interface database_option {
public function custom_query($sql);
public function get_table_data($table_name);
} class mysql_conn implements database_option {
private $dbh = null;
private $host = 'localhost';
private $port = '3306';
private $user = 'root';
private $password = '****';
private $dbname = 'test'; public function __construct() {
$this->dbh = new PDO('mysql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbname, $this->user, $this->password);
} public function get_table_data($table_name) {
foreach($this->dbh->query("SELECT * from `$table_name`") as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
} public function custom_query($sql) {
$stmt = $this->dbh->prepare($sql);
$stmt->execute();
foreach ($stmt as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
}
} class psql_conn implements database_option {
private $dbh = null;
private $host = 'localhost';
private $port = '5432';
private $user = 'postgres';
private $password = '****';
private $dbname = 'test'; public function __construct() {
$this->dbh = new PDO('pgsql:host=' . $this->host . ';port=' . $this->port . ';dbname=' . $this->dbname, $this->user, $this->password);
} public function get_table_data($table_name) {
foreach($this->dbh->query("SELECT * from `$table_name`") as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
} public function custom_query($sql) {
$stmt = $this->dbh->prepare($sql);
$stmt->execute();
foreach ($stmt as $row) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
}
} abstract class Factory {
abstract public static function create_mysql_conn();
abstract public static function create_psql_conn();
} class db_Factory extends Factory {
public static function create_mysql_conn() {
return new mysql_conn();
} public static function create_psql_conn() {
return new psql_conn();
}
} // mysql
// $mysql_dbh = db_Factory::create_mysql_conn();
// $mysql_dbh->get_table_data('order'); // psql
// $psql_dbh = db_Factory::create_psql_conn();
// $psql_dbh->custom_query('select * from student');
原文地址:https://www.ryanzoe.top/%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f/php-factory-design-pattern/
PHP 设计模式之三种工厂模式的更多相关文章
- Java设计模式之三种工厂模式
工厂模式实现了创建者和调用者的分离,实现了更好的解耦. 详细分类: 1) 简单工厂模式(静态工厂模式): 2) 工厂方法模式: 3) 抽象工厂模式 面向对象设计的基本原则: 1) OC ...
- java设计模式---三种工厂模式
工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...
- java设计模式---三种工厂模式之间的区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...
- C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】
一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简 ...
- java设计模式三种工厂模式简单介绍
一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...
- 设计模式—三种工厂模式(JAVA)
一:简单工厂: 有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机: 缺点:在工厂类中集中了所有实例的创建逻 ...
- 我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式
摘要:工厂模式是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性. 本文分享自华为云社区<[Java设计模式]用 披萨订购案例 详 ...
- IOS设计模式之三:MVC模式
IOS设计模式之三:MVC模式 模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...
- 三种工厂模式的分析以及C++实现
三种工厂模式的分析以及C++实现 以下是我自己学习设计模式的思考总结. 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型, ...
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
随机推荐
- springboot添加ssl实现https访问(http自动跳转)
目录 Step1 Step2 Step3 Step4 Step5 Tips: 直接docker部署的时候端口号问题 Step1 去搞一个证书,我的是腾讯买域名送的 Step2 下载jks格式的 Ste ...
- LLM 输出配置 (LLM output configuration)
1.概述 大型语言模型(LLM)的输出行为可以通过多种配置参数进行精细控制.这些参数共同决定了模型生成文本的质量.风格和多样性.理解这些配置选项及其相互作用对于有效使用LLM至关重要. 2.输出长度 ...
- kubernetes配置glusterfs动态存储
GlusterFS分布式文件系统 一.简单介绍 分布式存储按其存储接口分为三种:文件存储.块存储.对象存储 文件存储 通常支持POSIX接口(如glusterFS,但GFS.HDFS是非POSIX接口 ...
- JVM 类加载过程与字节码执行深度解析
在 Java 高级程序员面试中,类加载机制与字节码执行原理是 JVM 模块的核心考察点.本文从类加载生命周期.类加载器协作机制.字节码执行引擎及面试高频问题四个维度,结合 JVM 规范与 HotSpo ...
- F-47(copy 邓大顾)
*&---------------------------------------------------------------------* *& F-47过账 *&--- ...
- 鸿蒙Next仓颉开发语言中的数据类型总结分享
大家好,今天总结一下仓颉中的数据类型. 数字 仓颉中的数字类型复杂多样,首先分为整型和浮点型两种,也就是Int类型和Float类型,Int类型有Int.Int8.Int32.Int64几种类型,Flo ...
- oracle库exp导出dmp文件导入 expdp导出不适用
//创建用户 create user test identified by test; grant connect,resource,dba to test; //cmd 命令执行dmp文件 imp ...
- 在Ubuntu上使用Certbot申请Let’s Encrypt SSL证书
1 引言 要使用HTTPS就必须得有SSL证书.理论上,证书是可以通过像OpenSSL这样得工具生成的.不过这种证书只能自己测试用,浏览器上面是不认的,会提示用户不安全.也就是说,浏览器只接受一些特定 ...
- 一个static关键字引发的线上故障:深度剖析静态变量与配置热更新的陷阱
引言:一个看似无害的修改 "这不可能有问题!" 我盯着屏幕上的代码变更,反复确认那个仅仅增加了static关键字的修改. 事情的起因是我们需要上线一个新的HTTP接口调用功能,为了 ...
- Educational Codeforces Round 96 ABCDE 题解(详解)
A. Number of Apartments 题意:用3.5.7凑数,若能凑出给出方案,不能则输出-1. 思路:观察发现除了1 2 4凑不到以外其他都凑得到.那么关于方案的话,既然其他数都凑得到,我 ...