设计模式起源
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
什么工厂模式
工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤。很多高级模式都是依赖于工厂模式
工厂模式的好处
1). PHP中能够创建基于变量内容的类的新实例,减少主代码流中的基于条件复杂性;
2). 同时如果类发生改变不需要所有的地方进行修改,只需要在工厂中进行修改
应用场景
1). 做支付接口的时候,未来可能对应不同的支付网关:支付宝、财付通、网银在线等。方便未来扩展,设计成工厂模式。定一个专门生产网关接口的工厂,抽象出来,做成接口形式,让所有的子类都要实现它的接口。以后加一个支付方式,要使用哪一种支付方式,改变一下参数即可。2). 在为用户注册的时候,分为很多种角色的用户。比如册用户,匿名用户、管理员用户等。完全使用可以使用工厂的思想来实现,代码也容易维护,为每种角色可以生成操作的类等等。
根据抽象程度的不同,PHP工厂模式分为三种
1. 简单工厂模式
<?php
/**
*
* 工厂方法模式
*
* */
interface Db {
public function conn();
}
/**
*@class 服务端开发(不知道谁将会被调用)
*
* */
class Dbmysql implements Db {
public function conn() {
echo '连上mysql了';
}
}
class Dbsqlite implements Db {
public function conn() {
echo '连上sqlite了';
}
}
/**
*定义一个工厂接口
*
* */
interface Factory {
public function createDb();
}
/**
*实现工厂接口
* */
class MysqlFactory implements Factory {
public function createDb() {
return new dbmysql();
}
}
class SqliteFactory implements Factory {
public function createDb() {
return new dbsqlite();
}
}
/**
*新添加一个oracle
* */
class Dboracle implements Db {
public function conn() {
echo '连上oracle了';
}
}
class OracleFactory implements Factory {
public function createDb() {
return new dboracle();
}
}
$fact = new mysqlFactory();
$db = $fact->createDb();
$db->conn();
// $fact = new SqliteFactory();
// $db = $fact->createDb();
// $db->conn();
// $fact = new OracleFactory();
// $db = $fact->createDb();
// $db->conn();
2. 工厂方法模式
<?php
/*简单工厂模式Factory,提供一个工厂方法供客户端调用,且简单工厂模式又称静态工厂方法模式,之所以可以这么说,是因为简单工厂模式是通过一个静态方法来创建对象的。
但可能违反开闭原则。
什么是开闭原则?
软件实现应该对扩展开放,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化的
*/
/**
*@class 服务端开发(不知道谁将会被调用)
* 事例一
*
* */
class Dbmysql {
public function conn() {
echo '连接上了Mysql';
}
}
class Dbsqlite {
public function conn() {
echo '连接上了sqlite';
}
}
class Factory {
public static function createDb($type = '') {
if ($type == 'mysql') {
return new Dbmysql();
} elseif ($type == 'sqlite') {
return new Dbsqlite();
} else {
throw new Exception('Error db type', 1);
}
}
}
$db = Factory::createDb('mysql');
// $db = Factory::createDb('sqlite');
$db->conn();
/**
*@class 服务端开发(不知道谁将会被调用)
*事例二
* */
// interface Db {
// public function conn();
// }
// class Dbmysql implements Db {
// /**
// * summary
// */
// public function conn() {
// echo '连上mysql了';
// }
// }
// class Dbsqlite implements Db {
// public function conn() {
// echo '连上sqlite了';
// }
// }
// class Factory {
// public static function createDb($type = '') {
// if ($type == 'mysql') {
// return new Dbmysql();
// } elseif ($type == 'sqlite') {
// return new Dbsqlite();
// } else {
// throw new Exception('Error db type', 1);
// }
// }
// }
// $db = Factory::createDb('mysql');
// // $db = Factory::createDb('sqlite');
// $db->conn();
3. 抽象工厂模式
<?php
/**
*抽象工厂 :用来生产不同产品族的全部产品。
*
* 一个系统不应当依赖于产品类实例何如被创建,组合和表达的细节,
* 这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,
* 而系统只消费其 中某一产品族。同属于同一个产品族的产品是在一起
* 使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类
* 的库,所有的产品以同样的接口出现,从 而使客户端不依赖于实现。
*
*
* */
//共同接口
interface People {
public function say();
}
/**
*@class 服务端开发(不知道谁将会被调用)
*
*/
class OneMan implements People {
public function say() {
echo '男1<br>';
}
}
class TwoMan implements People {
public function say() {
echo '男2<br>';
}
}
class TwoWoman implements People {
public function say() {
echo '女2<br>';
}
}
class OneWoman implements People {
public function say() {
echo '女1<br>';
}
}
/**
*
* 创建工厂
* 注意:这里将对象的创建抽象成了一个接口
* */
interface CreatePeople {
public function createOne();
public function createTwo();
}
/**
* Class FactoryMan 用于创建男人对象的工厂类-继承createPeople
*/
class FactoryMan implements CreatePeople {
// 创建第一个男人
public function createOne() {
return new OneMan();
}
// 创建第二个男人
public function createTwo() {
return new TwoMan();
}
}
/**
* Class FactoryWomen 用于创建女人对象的工厂类-继承createPeople
*/
class FactoryWomen implements CreatePeople {
// 创建第一个女人
public function createOne() {
return new OneWoman();
}
// 创建第二个女人
public function createTwo() {
return new TwoWoman();
}
}
// $factory = new FactoryMan();
// $man = $factory->createOne();
// $man->say();
// $man = $factory->createTwo();
// $man->say();
$factory = new FactoryWomen();
$woman = $factory->createOne();
$woman->say();
$woman = $factory->createTwo();
$woman->say();
这篇博客能给你带来帮助