1. 第一种模式必须知道类名
/**
* 女人类
*/
class woman{
public function display(){
echo '我是女人';
}
}
/**
* 男人类
*/
class man{
public function display(){
echo '我是男人';
}
}
/**
* 人妖类
*/
class person{
public function display(){
echo '我是人妖';
}
}
/**
* 工厂模式
*/
class Factory
{
public static function createObj($className)
{
if ($className) {
return new $className();
} else {
return null;
}
}
}
$ceshi = Factory::createObj('woman'); //实例化女人
$ceshi->display(); // 输出:我是女人
$ceshi = Factory::createObj('man'); //实例化男人
$ceshi->display(); // 输出:我是男人
$ceshi = Factory::createObj('person'); //实例化人妖
$ceshi->display(); // 输出:我是人妖
2. 匿名工厂 不需要知道类名
/**
* 女人类
*/
class woman{
public function display(){
echo '我是女人';
}
}
/**
* 男人类
*/
class man{
public function display(){
echo '我是男人';
}
}
/**
* 人妖类
*/
class person{
public function display(){
echo '我是人妖';
}
}
/**
* 匿名工厂模式
*/
class anonyFactory{
public static function createObj($flag){
switch ($flag){
case 'm':
return new woman();
case 'w':
return new man();
case 'p':
return new person();
default:
return null;
}
}
}
$ceshi = anonyFactory::createObj('m'); //实例化女人
$ceshi->display(); // 输出:我是女人
$ceshi = anonyFactory::createObj('w'); //实例化男人
$ceshi->display(); // 输出:我是男人
$ceshi = anonyFactory::createObj('p'); //实例化人妖
$ceshi->display(); // 输出:我是人妖
1. 工厂模式是一种按需生产对象的模式
2. 工厂模式通常 是需要在大型项目中,会出现很多的相同的类,此时可以使用工厂产生对象。
3. 工厂模式的优点就是能够方便的维护
4. 工厂模式的缺点是随着功能的增加了,会需要增加很多开发量(多个工厂)
// product类
class ProductA{
public function __construct(){
echo 'ProductA';
}
}
// productB类
class ProductB{
public function __construct(){
echo 'ProductB';
}
}
// 抽象产品类
class Factory{
public static function createProduct($type){
switch($type){
case 'A':
return new ProductA();
case 'B':
return new ProductB();
}
}
}
// 测试
$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
// var_dump($productA);
// var_dump($productB);
* 工厂模式
* 1. 一个类无法预期要创建的对象类
* 2. 一个类使用其子类创建对象
* 3. 一个类希望由子类来指定创建对象
*
* 优点:
* 1. 一个调用者想创建一个对象,只要知道其名称就可以了
* 2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以
* 3. 屏蔽产品的具体实现,调用者只关心产品的接口
*
* 缺点:
* 1. 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加
* 2. 增加了系统的抽象性和理解难度
*
* 适用场景:
* 1. 客户端不知道它所需要的对象的类
* 2. 抽象工厂类通过其子类来指定创建哪个对象
* 3. 创建对象的任务由多个具体子工厂类中的某一个完成,而抽象工厂仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节