php设计模式之工厂模式

设计模式起源

在 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();
这篇博客能给你带来帮助
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值