<?php
# https://blog.csdn.net/u010412301/article/details/54925217
############################################简单工厂模式###################################################
# 也叫静态工厂模式
interface IDb{
public function connect();
public function findOne();
public function findAll();
public function insert();
public function update();
public function save();
}
# mysql的操作类
class Mysql implements IDb{
public function connect(){
}
public function findOne(){
}
public function findAll(){
}
public function insert(){
}
public function update(){
}
public function save(){
}
}
# PDO操作类
class Pdo implements IDb{
public function connect(){
}
public function findOne(){
}
public function findAll(){
}
public function insert(){
}
public function update(){
}
public function save(){
}
}
class factoryDB{
public static function craeteMYSQL(){
return new Mysql;
}
public static function craetePdo(){
return new Pdo;
}
}
# 使用PDO连接mysql
factoryDB::craetePdo();
# 使用mysql连接mysql
factoryDB::craeteMYSQL();
# 问题: 如果现在换成mysqli 或者是 oracle数据库,整个系统都需要去改动了
##############################################################################简单工厂模式####################################################################
##################################################工厂模式############################################################
# 定义一个创建对象的接口,让子类决定哪个类实例化。
# 遵循封闭开发原则
###########创建对象接口的写法##################
interface newDb{
public function createDb();
}
class createMysql implements newDb{
public function createDb(){
return new Mysql();
}
}
class createPDO implements newDb{
public function createDb(){
return new Pdo();
}
}
class Client {
function test( $type = 1 ) {
switch ($type) {
case '1':
$obj = new createMysql();
return $obj -> createDb();
break;
case '2':
$obj = new createPDO();
return $obj -> createDb();
break;
default:
# code...
return 'unknow type';
break;
}
}
}
###########创建对象接口的写法##################
###########简单的写法##################
class client2{
# 获取数据库的对象
public static function CreateDb( $type = 1 ){
switch ($type) {
case '1':
# code...
return new Mysql();
break;
case '2':
# code...
return new Pdo();
break;
default:
# code...
return 'unknow type';
break;
}
}
}
# 现在如果要支持mysqli和 oracle
# 1、直接添加对应的基类
# 2、在client中添加对应的case 即可
# 3、后期要切换数据连接的时候,统一修改一个地方即可
###########简单的写法##################
##################################################工厂模式############################################################
##########抽象工厂模式####################
# 抽象工厂
# 注意:这里和工厂方法的区别是:一系列,而工厂方法则是一个。
# 那么,我们是否就可以想到在接口createDB里再增加创建“一系列”对象的方法呢?
# 如果我想在某个地方使用长连接是无法使用的
interface newDb{
public function createDb();
}
# mysql的操作类
class PMysql implements IDb{
# 长连接连接
public function Pconnect(){
}
public function findOne(){
}
public function findAll(){
}
public function insert(){
}
public function update(){
}
public function save(){
}
}
interface newDb2{
public function createDb();
public function createPDb();
}
class createMysql implements newDb2{
public function createDb(){
return new Mysql();
}
public function createPDb(){
return new PMysql();
}
}
class createPDO implements newDb2{
public function createDb(){
return new Pdo();
}
public function createPDb(){
return new PMysql();
}
}
class Client3{
function test( $type ) {
switch ($type) {
case '1':
$obj = new createMysql();
return $obj -> createDb();
break;
case '2':
$obj = new createPDO();
return $obj -> createDb();
break;
default:
# code...
return 'unknow type';
break;
}
}
}
##########抽象工厂模式####################
/**
区别:
简单工厂模式:用来生产同一等级结构中的任意产品。对与增加新的产品,无能为力
工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
以上三种工厂 方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法
适用范围:
简单工厂模式:
工厂类负责创建的对象较少,客户只知道传入工厂类的参数,对于如何创建对象不关心。
工厂方法模式:
当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中得某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法模式。
抽象工厂模式:
一个系统不应当依赖于产品类实例何如被创建,组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其 中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从 而使客户端不依赖于实现。
无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。
*/